Когда использовать насмешку по сравнению с фальсифицированием в поблочном тестировании C#?

Технически можно переопределить оператор , новый удаляют ), и соберите информацию обо всей выделенной памяти, таким образом, у Вас может быть метод, чтобы проверить, допустима ли память "кучи". но:

  1. Вам все еще нужен способ проверить, выделяется ли указатель на стеке ()

  2. , необходимо будет определить то, что является 'допустимым' указателем:

a) память на том адресе выделяется

, b) память в том адресе , запускаются адрес объекта (например, адрес не посреди огромного массива)

, c) память в том адресе , запускаются , адрес объекта [1 114] ожидал Нижняя строка типа

: рассматриваемым подходом не является C++ путь, необходимо определить некоторые правила, которые гарантируют, что функция получает допустимые указатели.

50
задан Rap 19 October 2013 в 09:42
поделиться

3 ответа

Что ж, у вас есть несколько вещей, которые вам нужно решить. У вас есть две основные вещи, которые вам нужно знать: номенклатура и передовой опыт.

Сначала я хочу дать вам отличный видео-ресурс от великого тестировщика Роя Ошерова:

Обзоры модульного тестирования Роя Ошерова

Он начинает с того, что сделал несколько обзоров тестовых жгутов поставляется с несколькими открытыми исходными кодами проекты. Вы можете найти их здесь: http://weblogs.asp.net/rosherove/archive/tags/TestReview/default.aspx

Это в основном видеообзоры где он проводит вас через этот тест запрягает и говорит вам, что хорошо а что плохо. Очень полезно.

У Роя также есть книга, которую я понимаю. очень хорошо.

Номенклатура

Этот подкаст поможет безмерно : http://www.hanselminutes.com/default.aspx?showID=187

Я перефразирую подкаст, хотя (что вступительная музыка Hanselminutes ужасно):

Практически все, что вы делаете с каркас изоляции (например, Moq, Rhino Mocks, Type Mock и т. Д.) Называется поддельный .

поддельный - объект, используемый во время проверка того, что код, который вы тестируете можно позвонить вместо производственного кода. Подделка используется для изоляции кода, который вы пытаются проверить из других частей ваше приложение.

Существует (в основном) два типа подделок : заглушки и издевается над .

mock - это подделка, которую вы вставляете поместите так, чтобы код, который вы тестируете можете взывать к нему, и вы утверждаете, что звонок был сделан с правильным параметры. В приведенном ниже примере просто это с использованием изоляции Moq каркас:

  [TestMethod]
public void CalculateTax_ValidTaxRate_DALCallIsCorrect ()
{
 // Упорядочить
 Mock  taxDALMock = новый Mock  ();
 taxDALMock.Setup (taxDAL => taxDAL.GetTaxRateForZipCode ("75001"))
 .Returns (0,08) .Verifiable ();

 TaxCalculator calc = новый TaxCalculator (taxDALMock.Object);

 // Действие
 десятичный результат = calc.CalculateTax ("75001", 100.00);

 // Утвердить
 taxDALMock.VerifyAll ();
}

Заглушка почти такая же, как и издеваться, кроме того, что вы ставите его на место чтобы убедиться, что код, который вы тестируете возвращает согласованные данные из своих вызов (например, если ваш код вызывает уровень доступа к данным, заглушка будет вернуть поддельные данные), но вы этого не сделаете утверждать против самого заглушки. Который есть, вам не нужно проверять, что метод называется вашим поддельным доступом к данным слой - вы пытаетесь протестировать что-то другое. Вы предоставляете заглушку чтобы получить метод, который вы пытаетесь использовать тест для изолированной работы.

Вот пример с заглушкой:

  [TestMethod]
public void CalculateTax_ValidTaxRate_TaxValueIsCorrect ()
{ 
 // Упорядочить
 Mock  taxDALStub = новый Mock  ();
 taxDALStub.Setup (taxDAL => taxDAL.GetTaxRateForZipCode ("75001"))
 . Возврат (0,08);

 TaxCalculator calc = новый TaxCalculator (taxDALStub.Object); 

 // Действие
 десятичный результат = calc.CalculateTax ("75001", 100.00);

 // Утвердить
 Assert.AreEqual (результат, 8.00);
}

Обратите внимание, что мы тестируем вывод метода, а не факт, что метод вызвал другой ресурс.

Moq на самом деле не делает API различие между макетом и заглушкой (обратите внимание, оба были объявлены как Mock ), но здесь используется важно при определении типа.

Надеюсь, это поможет вам разобраться.

83
ответ дан 7 November 2019 в 10:48
поделиться

Вы хотите протестировать кусок кода, так, скажем, метод. Ваш метод загружает файл с URL-адреса http, а затем сохраняет файл на диск, а затем отправляет по почте, что файл находится на диске. Все эти три действия, конечно же, являются служебными классами, вызываемыми вашими методами, потому что тогда их легко имитировать. Если вы не имитируете их, ваш тест будет загружать материалы, обращаться к диску и отправлять сообщение по электронной почте каждый раз, когда вы запускаете этот тест. Тогда вы не просто тестируете код в методе, вы также тестируете код, который загружается, записывает на диск и отправляет почту. Теперь, если вы издеваетесь над ними, вы тестируете только код методов. Также вы можете смоделировать, например, сбой загрузки, чтобы убедиться, что код вашего метода работает правильно.

Что касается подделки, я обычно подделываю классы, которые просто хранят значения, и не имеют особой логики. Если вы отправляете объект, содержащий некоторые значения, которые изменяются в методе, вы можете прочитать его в тесте, чтобы убедиться, что метод работает правильно.

Конечно, правила можно (а иногда и нужно) немного изменить, но общий способ мышления - это проверить свой код, и только свой код.

1
ответ дан 7 November 2019 в 10:48
поделиться

Существует как минимум 5 различных видов тестовых двойников: манекены, заглушки, моки, шпионы и фейки. Хороший обзор находится на http://code.google.com/testing/TotT-2008-06-12.pdf , и они также разделены на категории на http://xunitpatterns.com/Mocks. ,% 20Fakes,% 20Stubs% 20and% 20Dummies.html

17
ответ дан 7 November 2019 в 10:48
поделиться
Другие вопросы по тегам:

Похожие вопросы: