Как использовать 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 - это устаревший код, в котором вы не можете найти зависимости. Это не значит, что они хорошие, но иногда они вам нужны.

Другие вопросы по тегам