Каковы реальные плюсы и минусы каждого из основных таких платформ?

Смотрите также на "что следует учитывать, когда выбирая насмешливый рамок .Чистая"

Я пытаюсь выбрать насмешливую структуру для использования в проекте .NET, который я недавно начал. Я хотел бы ускорить мои исследования по различным фреймворкам. Я недавно прочитал это сообщение в блогеhttp://codevanced.net/post/Mocking-frameworks-comparison.aspx и задался вопросом, есть ли у кого-либо из аудитории StackOverflow что-нибудь добавить на пути реальные преимущества и недостатки базы.

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

  • RhinoMocks
  • Moq
  • TypeMock Изолятор
  • NMock
  • Кротов

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

7 ответов


Я вообще не знаю Кротов, Но я покрою те, о которых я знаю немного (мне действительно нужен стол для этого).

Moq

плюсы

  • Type-safe
  • последовательный интерфейс
  • поощряет хороший дизайн

минусы

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

Носорог Издевается

плюсы

  • Type-safe
  • полный набор функций
  • поощряет хорошее дизайн

минусы

  • путаешь API-интерфейс. Есть слишком много разных способов сделать то же самое, и если вы объедините их неправильно, это просто не сработает.
  • может только имитировать интерфейсы и виртуальные / абстрактные члены

TypeMock Изолятор

плюсы

  • Type-safe (AFAIR)
  • может издеваться что-нибудь

минусы

  • очень инвазивных
  • Блокировка Потенциального Поставщика
  • не поощряет хороший дизайн

NMock

плюсы

  • поощряет хороший дизайн
  • работает на любой версии .NET (даже 1.1)

минусы

  • не type-safe
  • может только имитировать интерфейсы и виртуальные / абстрактные члены

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

Я начал с NMock, когда это был единственный вариант еще в 2003 году, затем перешел на Rhino Mocks из-за его безопасности типа, А теперь использую Moq из-за более простого API.


до сих пор я использовал RhinoMocks и Moq. Moq в настоящее время мой любимый из-за его простоты, которая в настоящее время все, что мне нужно. RhinoMocks довольно мощный, но я никогда не был в состоянии полностью подключиться к нему.


мы уже больше года используем насмешки носорогов. PRO:

  • легко создавать насмешки
  • может издеваться над публичными и внутренними методами
  • может имитировать интерфейсы или классы
  • может создавать частичные насмешки (насмешки только определенных методов из класса)

против:

  • методы должны быть как минимум внутренними и виртуальными (может испортить вашу архитектуру)
  • трудно использовать для property-by - property утверждает, особенно для коллекций объектов, которые создаются внутри тестовой области-синтаксис ограничений усложняется
  • вы должны быть осторожны, когда запись останавливается и воспроизведение начинается
  • осторожно о том, что вызовы высмеиваются (например, вызов свойства, который вы не видели или метод, который не был виртуальным) - ошибки, которые вы можете получить, не очень полезны

в целом, мы обнаружили, что через высмеивание фреймворки способствуют тестированию "белого ящика" (особенно для модульных тестов). Мы закончили с тестами, которые подтвердили, как все было сделано, а не то, что они делали. Они были бесполезны для рефакторинга, и нам пришлось переписать большинство из них.


как Фрэнк и Крис, я попробовал RhinoMocks и переключился на Moq. Я не был разочарован. См. мою серию сообщений в блоге:

EDIT: обратите внимание, что я обычно делаю тестирование на основе состояний с заглушками; я редко делаю тестирование поведения с проверяемыми насмешками.


Я не использовал все эти рамки, но я посмотрел на RhinoMocks и Moq и пошел с Moq, потому что он чувствует себя более элегантным и намного проще. Я использую транковую версию, которая включает обязательное исправление для ограничения аргумента 4, наложенного на обратные вызовы в последней бета-версии 4.0.

Мне особенно нравится поведение Moq по умолчанию, которое не ведет себя как строгий макет объекта неудачных тестов при неожиданных вызовах. Вы можете настроить его для этого, если хотите, но я найдите, что требует от меня тратить слишком много времени на настройку ожиданий и недостаточно времени на тестирование.


Я использую TypeMock, так как я разрабатываю на SharePoint. Поскольку TypeMock может издеваться над чем угодно, он оказался ценным ресурсом при модульном тестировании наших веб-частей SharePoint, получателей событий, рабочих процессов и т. д.

с другой стороны, TypeMock может быть дорогим, однако есть версия доступно, что специфично для SharePoint и стоит меньше, чем полный пакет TypeMock. Очень рекомендую.

единственное, с чем я не согласен, это то, что TypeMock это не заставляет вас разрабатывать свой код очень хорошо. Часто классы, которые я создаю, и общий код хорошо разработаны. Только потому, что я использую TypeMock, не означает, что я жертвую качеством своего дизайна - я все еще практикую МОК и SRP. Только потому, что TypeMock может издеваться над чем угодно, не означает, что я пишу свой код, чтобы отразить эту способность.


вы можете иметь в виду, что если вам нужно поддерживать многоязычную среду (например, VB), все настраиваемые фреймворки кода (я могу напрямую говорить с Moq и RhinoMocks) будут болезненными, учитывая (отсутствие) анонимный синтаксис делегата/лямбда в VB. Это будет более возможно в Visual Studio 2010 / VB 10, но все равно не будет сопоставимо с хорошим синтаксисом C# lambda.

TypeMock, похоже, имеет некоторую поддержку VB