Что следует учитывать при выборе макета для .Net - PullRequest
33 голосов
/ 13 марта 2009

Существует множество фреймворков для .Net. Нет явного победителя, который бы во всех отношениях вытеснил остальных. Ведущие фреймворки также имеют много различных стилей использования.

Время, необходимое для изучения всех фальшивых фреймворков достаточно хорошо, чтобы решить, какой из них использовать, нецелесообразно. Я не верю, что мы еще достигли стадии, когда мы можем говорить о лучшей фальсификационной структуре. Итак, какие вопросы я должен задать, как о проекте, так и о себе, чтобы помочь определиться с наилучшей структурой для насмешек в конкретном случае?

Было бы также полезно узнать, почему вы выбрали платформу для насмешек, которую используете в данный момент, и довольны ли вы этим выбором.

Есть ли полезный словарь, который можно использовать при сравнении стилей фальшивых рамок?

( Примечание: Я ограничил этот вопрос .Net, так как в Java нет атрибутов или лямбда-выражений, поэтому я надеюсь, что моделирующая среда лучше для .Net, чем для Java)

Резюме на данный момент:

  • Если вам нужно смоделировать статический метод, или нет виртуальных методов, то единственный Разумный вариант - TypeMock , однако он не бесплатен и не ведет к хорошему дизайну.
  • Rhino Mocks - очень хороший вариант, если вы делаете TDD, т.е. объекты, которые вы хочу издеваться над реализацией интерфейсов. В настоящее время это, кажется, «лидер рынка»
  • Moq ( введение ) следует рассмотреть, если вы использование .NET 3.5 Moq может получить на Rhino Mocks для новых проектов

Что я упустил из этого резюме?

Так что же определяет выбор между Rhino Mocks и Moq , если вы используете .NET 3.5?


см. Также:

« Что следует учитывать при выборе среды внедрения зависимостей для .NET? » также может представлять интерес, так как задает «другую сторону» вопроса.

Ответы [ 8 ]

21 голосов
/ 13 марта 2009

Итак, какие вопросы я должен задать, спрашивая о проекте и о себе, чтобы помочь выбрать наилучшую систему для насмешек для использования в данном случае?

Вопросы, которые вы должны задать о проекте: был ли проект разработан с использованием принципов SOLID или нет? Это проект, который имеет слабую связь и высокую сплоченность? Были ли использованы хорошие принципы ОО при создании проекта? Используется ли контейнер для инъекций зависимости? Была ли система закодирована в методе проектирования по контракту (с тщательным использованием интерфейсов)?

Если вы ответите «да» на эти вопросы, то вы можете использовать фальшивую платформу, такую ​​как RhinoMocks, которую некоторые называют «фальшивой». RhinoMocks и некоторые другие фреймворки имеют очень сильные мнения о том, как должна быть спроектирована система для того, чтобы объекты были смоделированы. Фреймворк, такой как RhinoMocks, ожидает, что ваш проект будет спроектирован определенным образом. С RhinoMocks, конечно, гораздо проще создавать mocking, если вы правильно построили свой код (без запечатанных классов, без статики, интенсивного использования интерфейсов, виртуальных методов класса и т. Д.)

Если вы ответите «нет» на эти вопросы, или если вы работаете в устаревшей системе с большим количеством сильно связанных классов, тогда ваш единственный выбор будет TypeMock, который может высмеивать практически все, что угодно.

Было бы также полезно узнать, почему вы выбираете структуру насмешки, которую вы используете в настоящее время, и если вы все еще довольны этим выбором.

Я выбрал RhinoMocks, потому что в то время (более 3 лет назад) это был явно самый зрелый фреймворк с большинством функций. Я остался с этим, потому что он развивался вдали, что делает мою жизнь намного легче (появление контейнера AutoMocking стало гигантским шагом к эффективности).

Что мне нравится в RhinoMocks, кроме набора функций и простоты использования, так это то, что он направляет меня к лучшему дизайну в моем коде. Я не идеальный программист, и я собираюсь делать ошибки в дизайне. Но такие инструменты, как RhinoMocks и NHibernate, помогают мне улучшить дизайн, потому что, когда я делаю ошибки и создаю плохой дизайн, с этими инструментами становится больно работать. Например, с NHibernate больно работать, если у вас плохой дизайн базы данных. С RhinoMocks очень трудно работать, если у вас плохой дизайн класса, вы не используете интерфейсы, не используете IoC ... и т. Д.

Мне нравится RhinoMocks, потому что это в конечном итоге помогает мне стать лучшим разработчиком, и не только потому, что я тестирую свой код, но и потому, что я формирую свой код - проектирую его - лучшим образом.

14 голосов
/ 13 марта 2009

Я предпочитаю Moq для проектов .NET 3.5. Он прост в использовании и, по моему опыту, помогает производить чистые и понятные юнит-тесты.

Нет технической причины, по которой вы не можете использовать более одного макета для одного проекта. Конечно, хорошо стандартизировать, но некоторые тесты могут лучше подойти для некоторых фреймворков.

10 голосов
/ 21 апреля 2009

Отказ от ответственности - я работаю на Typemock

Я не согласен с "Typemock не приводит вас к хорошему дизайну". Хороший или плохой дизайн - это вы, разработчик, а не инструмент, который вы используете. Получить инструмент, который сделает работу, и сделает вас продуктивным, но ответственность за хороший дизайн лежит на вас. Если вы думаете, что оборачиваете все виды абстракций внутри вашего кода, просто для тестирования, сделайте это, но у вас может не получиться «хорошего» дизайна. Это может быть более сложным, чем дизайн, который у вас есть сейчас.

9 голосов
/ 18 февраля 2011

Что следует учитывать при выборе макета для .Net

Еще один аспект, который следует учитывать, помимо структуры тестируемой базы кода, заключается в том, насколько удобочитаемы ваши тесты при использовании макетов.

В связи с этим я ставлю на голосование NSubstitute - одну из более новых фреймворков-насмешек с очень выразительным API (без лямбд) и сопоставимой функциональностью с Moq и Rhino Mocks. Недавно он достиг версии 1.0.

Пример использования (с домашней страницы NSubstitute):

//Create:
var calculator = Substitute.For<ICalculator>();

//Set a return value:
calculator.Add(1, 2).Returns(3);
Assert.AreEqual(3, calculator.Add(1, 2));

//Check received calls:
calculator.Received().Add(1, Arg.Any<int>());
calculator.DidNotReceive().Add(2, 2);

//Raise events
calculator.PoweringUp += Raise.Event();

Подробное сравнение читабельности тестов с использованием RhinoMocks , Moq и NSubstitute приводится здесь .

3 голосов
/ 05 ноября 2009

заглушки выглядит интересно, и я думаю, что он может поставляться с .NET V4. Я не знаю, в какой редакции студии разработчиков вам нужно будет ее использовать. В настоящее время вы можете скачать его по вышеуказанной ссылке.

Stubs - это легкий каркас для тестовые заглушки и обходы в .NET, то есть основательно на основе делегатов, типа безопасный, рефакторинг и исходный код генерироваться. Заглушки была разработана поддержка Кодекс контрактов писателя времени выполнения и обеспечить минимальные накладные расходы для Pex анализ белой коробки. Заглушки могут быть использованы на любой метод .NET, в том числе не виртуальные / статические методы в запечатанном типы.

(я разместил это как ответчик, а не добавлял его в вопрос, так как я никогда не использовал удары и только потратил на это несколько минут)

2 голосов
/ 13 марта 2009

RhinoMock - это в значительной степени современный фреймворк для .NET. Не может пойти не так с этим. Я думаю, вы можете рассматривать его "стиль" как "мастер на все руки", если хотите.

С их веб-сайта :

Что предлагает Rhino Mocks?

  • Явная модель записи и воспроизведения для ожиданий.
  • Natural Arrange, Act, Assert синтаксис
  • Поддержка .Net 2.0 и .Net 3.5
  • Работа со строго типизированными макетами.
  • Установка действий над методами, возвращение специального значения или генерирование исключения.
  • Ожидания, основанные на:
    • Соответствующие аргументы
    • Соответствующие ограничения
    • Пользовательский обратный вызов для проверки ожидаемых аргументов с использованием собственного кода
0 голосов
/ 03 июня 2012

Я использую Telerik JustMock , это очень профессиональный и простой макет фреймворка с хорошим документом.

0 голосов
/ 03 мая 2012

Я бы порекомендовал FakeItEasy. Это действительно описательный фреймворк-фреймворк, который позволяет очень легко читать и дразнить интерфейсы. Он имеет активное сообщество разработчиков открытого кода и работает очень хорошо.

...