Ответ 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>
), но использование здесь важно для определения типа.
Надеюсь, это поможет вам прямо.