В качестве компаньона моей серии блогов на .NET насмешливых фреймворков и того, как они работают, этот репозиторий пытается реализовать одни и те же модульные тесты с макетами, используя каждую из основных издевательств, доступных для .NET.
Этот проект предназначен для того, чтобы быть ссылкой для тех, кто хочет сравнить .NET Moging Frameworks или увидеть примеры синтаксиса для данной структуры. Он не предназначен для того, чтобы быть исчерпывающим ссылком, не является ли это не свободным от ошибок (но, пожалуйста, дайте мне знать, если вы найдете какие-либо проблемы).
Чтобы написать тесты, нам нужен код, нуждающийся в тестировании. Таким образом, я создал носитель LunchNotifier , немного больше, чем в мире, против которого могут быть написаны модульные тесты (с макетами).
Одним из преимуществ, предоставленных для складывания переполненных эмплпои, работающих в нью-йоркском офисе, является бесплатный обед от внутренних поваров. Каждый день, когда повара завершали приготовление еды, уведомление о том, что сотрудники в офисе сообщают им, что можно знать, что еда доступна.
В проекте CodeBeingTested , класс LunchNotifier является нашей главной целью.
Этот класс имеет пять внешних зависимости, которые необходимо высмеивать, чтобы выполнить наши тесты:
INotificationService (вводится через конструктор)ILogger (вводится через конструктор)IEmployeeService (вводится через конструктор)IEmployee ), базирующийся в офисе Нью -ЙоркаIEmployee (возвращен из IEmployeeService )System.DateTime Основная логика - в LunchNotifier.SendLunchtimeNotifications() . Этот метод включает в себя встроенный призыв к System.DateTime.Now , который не насмехается от противоположных рамок, таких как MOQ или Rhinomocks:
public void SendLunchtimeNotifications()
{
var now = DateTime.Now;
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Альтернативная реализация предусмотрена для использования с противоположными кадрами в LunchNotifier.SendLunchtimeNotifications_DateTimeSeam() , где призыв к DateTime.Now был извлечен в свой собственный метод, который можно заменить в макете:
public virtual DateTime GetDateTime() => DateTime.Now;
public void SendLunchtimeNotifications_DateTimeSeam()
{
var now = GetDateTime();
var templateToUse = now.Hour > 12 ? LateLunchTemplate : RegularLunchTemplate;
Каждый из оставшихся проектов пытается реализовать аналогичный набор модульных тестов против LunchNotifier с использованием различных смешных рамок.
Все тесты написаны с использованием NUNIT V3.10 с помощью пакета Nuget.
В некоторых случаях существует несколько способов подхода к тесту, используя смешительную структуру, поэтому я предоставил несколько вариантов теста, чтобы продемонстрировать различные подходы.
Этот тест создает фиктивного сотрудника «Боб», который предпочитает уведомления по электронной почте и использует макет, чтобы гарантировать, что логика LunchNotifier пришлю ему электронное письмо, когда будет готов.
Этот тест создает двух фиктивных сотрудников, «Боб» и «Марта» и гарантирует, что при отправке уведомления одному из них приводит к тому, что ошибка зарегистрировалась и не предотвращает уведомление оставшихся сотрудников.
В этом тесте используется синтаксис TestCase NUNIT для запуска двух тестовых случаев, один для до 13:00 и один для после 13:00, чтобы обеспечить использование соответствующего шаблона уведомлений на основе времени суток.
Для неограниченных фреймворков DateTime.Now можно напрямую контролировать, чтобы вернуть время ввода теста, однако ограниченные рамки не могут, поэтому они должны извлечь вызов в DateTime.Now в северный метод и вместо этого изменить поведение этого нового метода. Таким образом, необходимость в варианте SendLunchtimeNotifications_DateTimeSeam .
Тип: ограничен
Проект: https://github.com/moq/moq4/wiki/quickstart
Nuget: https://www.nuget.org/packages/moq/
Тип: ограничен
Проект: https://github.com/hibernating-rhinos/rhino-mocks
Nuget: https://www.nuget.org/packages/rhinomocks
ПРЕДУПРЕЖДЕНИЕ: Rhinomocks фактически является мертвым проектом и, скорее всего, не обеспечит поддержку будущих изменений в .NET, таких как .NET Core. Я не предлагаю вам начать использовать эту структуру, если вы еще не используете ее.
Чтобы запустить эти тесты, вы должны установить VS2017 Enterprise (или эквивалент).
Тип: ограничен
Проект: http://nsubstitute.github.io/
Nuget: https://www.nuget.org/packages/nsubstitute
Тип: без ограничений
Microsoft Fakes поступает в рамках Visual Studio 2017 Enterprise или Visual Studio 2015 Ultimate и не доступна в качестве специфического компонента.
Подделки не назнакомительно подтверждают проверку в стиле AssertWasCalled , поэтому я использую дополнительный пакет Nuget (который я внес свой вклад) для предоставления этой функции: подделки.
Тип: без ограничений
Информация о продукте: https://www.typemock.com/isolator
Этот продукт требует оплачиваемой лицензии (есть бесплатная 15-дневная пробная версия), чтобы сделать неограниченное издевательство. Typemock был достаточно хорош, чтобы предоставить мне бесплатную лицензию сообщества, чтобы я мог работать над такими проектами.