Как использовать Microsoft Fakes Shims для модульного тестирования тесно связанных классов в VB.NET 4, особенно для конструкторов
Microsoft Fakes - это относительно новая структура, и я также относительно новичок во ВСЕХ аспектах этого вопроса, поэтому мне нужны подробные ответы как таковые.
Передо мной была поставлена задача "модульного тестирования" приложения, мы назовем его "Устаревшее приложение" (по определению Майкла Фезерса), особенно в рамках платформы Microsoft Fakes. Причина, по которой мои менеджеры предлагают Fakes, заключается в том, что она позволяет разрешать модульное тестирование на основе внешних зависимостей и API, в частности, для удаления зависимости от базы данных.
Учитывая, что у меня слабый опыт работы с VB.net, платформой.NET в целом и модульным тестированием в целом, эта задача несколько сложна. Несмотря на это, я хотел бы получить представление об использовании SHIMS для обхода некоторых из этих внутренних зависимостей классов. Причина, по которой я заинтересован в SHIMS по сравнению с более быстрыми и более простыми в использовании STUBS, заключается в том, что в этом приложении нет интерфейсов (что-то еще, с чем я относительно незнаком), и интерфейс требуется для STUB.
Теперь, для более конкретного вопроса, учитывая этот фон, я хотел бы помочь с попыткой модульного тестирования класса, скажем, класса Person, который состоит из "строкового имени" и типа "Адресный адрес" и использует их в качестве параметров конструктора. Тогда у нас может быть класс Address с параметрами "string streetNumber", "string street" и пользовательским типом "State State" со своими собственными параметрами...
public class Person()
Private mName As String
Private mAddr As myclass.Address
Public Sub New(ByVal name As string, ByVal addr As Address)
mName = name
mAddr = addr
End Sub
И в других местах...
public class Address()
Private mStreet As String
Private mState As myclass.State
Public Sub New(ByVal street As String, ByVal state As State)
mStreet = street
mState = state
End Sub
И тогда будет состояние с какими бы свойствами и методами оно ни содержало....
Итак, я хотел бы знать, как построить модульный тест, чтобы изолировать класс Person от этих других классов (Address, State), чтобы, если они находятся в разработке или изменены, модульный тест для Person по-прежнему будет проходить... любые предложения???
1 ответ
В настоящее время у вас, похоже, нет проблем со связью, но вы не уверены в природе подделок. Заглушки могут использоваться в любом типе, который может быть расширен или реализован, и должен быть предпочтительнее, чем прокладки, когда они доступны, так как прокладки слишком тесно связывают вас с деталями реализации.
В Address я, вероятно, передам StubState, а Person - StubAddress. Обычная практика TDD требует, чтобы вы делали State и Address в интерфейсы, чтобы вам не требовался внешний код перед написанием теста, но это может не стоить того на таких простых типах (которые, вероятно, могут быть структурами? я не очень хорошо знаю VB.)
Ваша цель должна быть тупыми тестами. Тесты, которые проверяют только одну вещь. Заглушки должно быть достаточно для управления этим в вашем случае, так как вы уже делаете DI.
Основное использование shims - это устаревший код, в котором вы не можете найти зависимости. Это не значит, что они хорошие, но иногда они вам нужны.