2009-09-04 2 views
19

Я только начинаю заниматься разработкой Test Driven Development, и мне интересно узнать основные различия между RhinoMock, TypeMock и встроенным в насмешкой NUnit?RhinoMock против TypeMock против Mocking NUnit?

Любая информация была бы принята с благодарностью!

ответ

35

TypeMock - это коммерческий продукт (это означает, что вам придется заплатить за него), но позволит вам издеваться над конкретными объектами - в отличие от RhinoMocks/NUnit/MoQ, которые могут только издеваться над интерфейсом/абстрактным классом. Как это достигается, это пограничная черная магия, но с CLR она делает некоторые очень умные вещи.

Это может быть особенно полезно при использовании библиотек в вашем проекте, которые не используют многие интерфейсы. Таким образом, вы могли бы, например, использовать TypeMock для издевания объектов LINQtoSQL datacontext или Sharepoint. Однако, если вы используете TypeMock, это нет оправданий для плохого дизайна в вашей заявке.

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

Лично я использовал только MoQ и I < 3 it.

+2

Статические и герметичные классы не всегда плохие, но их невозможно издеваться с использованием RhinoMocks/NUnit/MoQ. Вы просто отказываетесь от всего набора функций только потому, что ваши инструменты не поддерживают его? –

+0

@HeavyWave они не являются простыми проектами, но если вы окажетесь в ситуации, когда вам нужно/нужно издеваться над ними, то это, вероятно, плохой дизайн. Это время_ – Kirschstein

+2

А, нет. У меня есть TON классов, которые не должны быть расширены пользователем, поэтому они не являются виртуальными/герметичными. И угадайте, что - мне часто нужно издеваться над одним из этих кланов для nit etst, где мне нужно конкретное поведение этого класса для показа. Разблокировать их нехорошо - структура «полагается» на них не расширяется. – TomTom

18

Видео от TDD - Understanding Mock Objects от Roy Osherove очень полезно в изучении различий в разных насмешливых библиотеках. Он не очень подробно разбирается в каждом аспекте, но достаточно, чтобы вы поняли. Надеюсь, это поможет. Рой также является главным архитектором TypeMock и является очень влиятельной фигурой на арене тестирования. Я не могу рекомендовать это видео достаточно для тех, кто хочет научиться использовать насмешку, а также узнать о доступных библиотеках.

Основное отличие между TypeMock и библиотекой с открытым исходным кодом заключается в том, что TypeMock использует API-интерфейс Profiler, предоставляемый Microsoft, а не dynamic proxy. Это позволяет TypeMock издеваться над конкретными классами и статическими методами. Если вы не уверены в том, что такое профайлер, это тот же API, который используется такими инструментами, как JetTrain dotTrace и RedGate Ants .Net. TypeMock просто использует API по-другому, чтобы подделывать (подделывать) то, что вы ему рассказываете.

@RichardOD, спасибо за напоминание, его книга «The Art of Unit Testing» более подробно описывает, где нет видео. У меня есть книга, и она очень информативна.

+0

У него также есть отличная книга. – RichardOD

2

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

Смазывание классов SharePoint невозможно с RhinoMock, Moq, NUNit и т. Д., Поскольку (я считаю) им требуются интерфейсы для издевательства объектов, а не возможность издеваться над конкретными конкретными классами.

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

+3

Вы всегда можете просто обернуть классы SharePoint в свой собственный простой класс-оболочку, который просто перенаправляет вызовы. После этого через класс обертки можно получить доступ через интерфейс и можно высмеивать. Класс обёртки также может действовать как фасад, чтобы упростить ваше взаимодействие с классами 3rdparty. Здесь вам не нужен TypeMock. –

+10

Проверка реальности: ВРЕМЯ ДЕНЬГИ. Да, я мог бы написать еще 100 классов, чтобы обойти ограничение тоже. Я также могу получить инструмент. Более дешевый. Меньше кода. – TomTom

14
  • Rhino.Mocks является открытым исходным кодом, постоянно развивается и совершенствуется каркас одним из самых продуктивных разработчиков в отрасли. Это было какое-то время и, следовательно, поддерживает довольно много разных парадигм для насмешек. Это может быть немного сложнее изучить поэтому в том смысле, что вы можете найти учебники для «старого» способа делать вещи.Вот подсказка, SetUpResultFor() и Expect.Call() - это старые способы делать вещи. Новый способ: mockObject.AssertWasCalled().

Я не имел никакого личного опыта с этими другими, но ...

  • MOQ является открытым исходным кодом, постоянно развивается и улучшается структура одного из несколько менее плодовитых разработчиков в отрасли (по сравнению с Ayende). Он новее и поэтому не обладает некоторыми функциями, которые Rhino.Mocks имеет. Это обычно не проблема, так как эти функции, как правило, те, которые несколько устарели в Rhino. Я слышал, что из-за этого немного легче учиться (кстати, насмехаются фальшивые рамки).
  • NUnit Mocks очень причудливый, насколько насмешливый идет. Он не поддерживает в настоящее время предпочтительный синтаксис Arrange-Act-Assert, полагающийся вместо этого на Expect-Verify (запись/воспроизведение). Он также полагается на строки для определения имен методов и свойств вместо лямбда. Это делает его значительно устойчивым к рефакторингу. Это серьезная проблема. Я бы не рекомендовал его.
  • TypeMock Isolater - хардкор для платных фальсификаций от компании (принадлежит?) Рой Ошероу - парень, который знает его тестирование, но также имеет несколько мягко противоречивые мнения относительно того, как его применять. Он действительно интенсивный, насколько он может это сделать, - спустившись на низкий уровень и изменив работу объектов CLR. Философия, лежащая в основе TypeMock, на самом деле не является 100% TDD. Часть преимуществ TDD заключается в том, что, охватывая ограничения Mocking frameworks, вы разработаете лучший код. TypeMock взрывает эти ограничения на куски. Насколько я знаю, в основном они используются людьми, которые пытаются получить код, который у них нет контроля над тестированием.
+0

Downvote? Я что-то не так понял? –

+2

Ничто не было от меня, но я не согласен с тем, что «охватывающий ограничения Mocking frameworks, которые вы разработаете лучше кода». Я имею в виду, ты серьезно? Скажем, я хочу следовать принципу «скрытия информации» и полностью инкапсулировать неглавный вспомогательный класс. Эти ограниченные насмешливые инструменты не позволили бы мне! Как выявление этого вспомогательного класса и сокращение инкапсуляции приведет к улучшению кода? –

+0

@Rogerio - То, что я имею в виду.Если вам нужно издеваться над тем, что вы создаете в своем объекте, то вы либо тестируете на слишком тонком уровне (т. Е., Если это классный тест класса с ним на месте), либо вы должны вводить его в качестве зависимости. Ограничения Rhino Mocks и MoQ заставляют вас использовать Dependency Injection, который является основным принципом хорошего дизайна OO. Они также не могут издеваться над статикой/глобальными состояниями - они также обескуражены в правильно спроектированном дизайне. И если вы используете такие методы, они должны быть прозрачными для вашего клиента (тестового/издевательского) кода. –

Смежные вопросы