Подтвердить что ты не робот

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

см. также "Что следует учитывать, когда выбирая издевательскую структуру для .Net"

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

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

  • RhinoMocks
  • Moq
  • Изолятор TypeMock
  • NMock
  • Родинки

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

4b9b3361

Ответ 1

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

Moq

Доводы

  • Типобезопасный
  • Согласованный интерфейс
  • Поощряет хороший дизайн

против

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

Rhino Mocks

Доводы

  • Типобезопасный
  • Полный набор функций
  • Поощряет хороший дизайн

против

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

Изолятор TypeMock

Доводы

  • Тип безопасности (AFAIR)
  • Может издеваться над чем-либо

против

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

NMock

Доводы

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

против

  • Небезопасный тип
  • Может только имитировать интерфейсы и элементы виртуальных/абстрактных

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

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

Ответ 2

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

Ответ 3

Мы использовали Rhino Mocks уже более года. PRO:

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

ПРОТИВ:

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

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

Ответ 4

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

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

Ответ 5

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

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

Ответ 6

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

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

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

Ответ 7

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

У TypeMock есть определенная поддержка VB