Подтвердить что ты не робот

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

Может ли кто-нибудь придумать рекомендации, предлагающие идеальные сценарии, чтобы выбрать насмешку против фальсификации, т.е. настроить необходимые вещи вручную?

Я немного смущен тем, как подойти к этой ситуации.

4b9b3361

Ответ 1

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

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

Отзывы о тестировании устройства Роем Ошеровом

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

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

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

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

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

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

В основном все, что вы делаете с (например, Moq, Rhino Mocks, Type Mock и т.д.) называется подделка.

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

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

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

[TestMethod]
public void CalculateTax_ValidTaxRate_DALCallIsCorrect()
{
    //Arrange
    Mock<ITaxRateDataAccess> taxDALMock = new Mock<ITaxRateDataAccess>();
    taxDALMock.Setup(taxDAL => taxDAL.GetTaxRateForZipCode("75001"))
                  .Returns(0.08).Verifiable();

    TaxCalculator calc = new TaxCalculator(taxDALMock.Object);

    //Act
    decimal result = calc.CalculateTax("75001", 100.00);

    //Assert
    taxDALMock.VerifyAll();
}

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

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

[TestMethod]
public void CalculateTax_ValidTaxRate_TaxValueIsCorrect()
{    
    //Arrange
    Mock<ITaxRateDataAccess> taxDALStub = new Mock<ITaxRateDataAccess>();
    taxDALStub.Setup(taxDAL => taxDAL.GetTaxRateForZipCode("75001"))
                  .Returns(0.08);

    TaxCalculator calc = new TaxCalculator(taxDALStub.Object); 

    //Act
    decimal result = calc.CalculateTax("75001", 100.00);

    //Assert
    Assert.AreEqual(result, 8.00);
}

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

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

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

Ответ 3

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

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

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

Ответ 4

The Little Mocker, от Боба Мартина, очень хорошее чтение по этой теме.

[...] давно некоторые очень умные люди написали статью, в которой вводился и определялся термин Mock Object. Многие другие читали его и начали использовать этот термин. Другие люди, которые не читали газету, услышали этот термин и начали использовать его с более широким смыслом. Они даже превратили слово в глагол. Они сказали бы: "Дайте нам высмеять этот объект" или "У нас есть много насмешек".

В статье объясняются различия между mocks, fakes, spys и stubs.