Вот описание каждого из них, за которым следует пример из реального мира.
Пустышка - просто фиктивные значения для удовлетворения API
.
Пример : Если вы тестируете метод класса, который требует много обязательных параметров в конструкторе, который не оказывает влияния на ваш тест, то Вы можете создавать фиктивные объекты с целью создания новых экземпляров класса.
Fake - создать тестовую реализацию класса, которая может зависеть от некоторой внешней инфраструктуры. (Хорошей практикой является то, что ваш юнит-тест НЕ фактически взаимодействует с внешней инфраструктурой.)
Пример : Создать фальшивую реализацию для доступа к базе данных, заменить ее с коллекцией
in-memory
.
Заглушка - переопределять методы для возврата жестко закодированных значений, также называемых state-based
.
Пример : Ваш тестовый класс зависит от метода
Calculate()
, который занимает 5 минут. Вместо того, чтобы ждать 5 минут, вы можете заменить его реальную реализацию заглушкой, которая возвращает жестко закодированные значения; занимая лишь небольшую долю времени.
Mock - очень похоже на Stub
, но interaction-based
, а не на основе состояния. Это означает, что вы не ожидаете от Mock
возврата какого-либо значения, но предполагаете, что выполняется определенный порядок вызовов методов.
Пример: вы тестируете класс регистрации пользователя. После вызова
Save
он должен позвонитьSendConfirmationEmail
.
Stubs
и Mocks
на самом деле являются подтипами Mock
, оба меняют реальную реализацию на тестовую реализацию, но по разным, специфическим причинам.
Есть несколько библиотек, реализующих это в .NET. Вот их список с тестом.
Да. Вы производите от абстрактного RealProxy
класса .
Не существует эквивалента прямого , но см. Как делать динамические прокси на C # для некоторых обходных путей:
Предпосылки: динамический прокси динамически генерирует класс в время выполнения, которое соответствует определенному интерфейс, проксируя все вызовы на единственный «общий» метод.
Ранее Стеллсми спросила, можно сделать это в .NET (это стандартная часть Java). Видя как это второй раз говорю об этом за столько дней, я считаю, это того стоит ведение блога ...
Наиболее широко используемым является динамический прокси Castle Project , который также используется несколькими (или, по крайней мере, 1) фреймворками для имитации. Имейте в виду, что методы (и подслащенные методы, такие как свойства) не являются виртуальными по умолчанию в dotnet, так что это может вызвать некоторые головные боли, если вы не ожидали этого в дизайне своего класса.
Взгляните также на PoshSharp (фреймворк AOP для .NET) - он может делать аналогичные вещи, но во время компиляции. Возможно, вы предпочтете поддерживаемый им подход.