2010-10-22 3 views
49

Я наткнулся на этот проект с открытым исходным кодом Fake It Easy, и я должен признать, это выглядит очень интересно, однако у меня есть сомнения, в чем разница между подделками FIE и произношением Moq Mocks? Кто-нибудь лучше подходит для конкретных целей?Являются ли подделки лучше, чем Mocks?

EDIT:

Что это об этой новой структуры, которая бы сделать это лучше, чем сказать Moq?

+0

Для совершенно иного рода насмехаясь и окурки посмотреть на платформе Microsoft родинок (HTTP: // research.microsoft.com/en-us/projects/moles/). Мольс позволяет издеваться над статическими, запечатанными и сторонними классами. – softveda

ответ

86

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

FakeItEasy не имеет «Подтверждаемых» или «Ожиданий», однако у него есть утверждения, однако они всегда четко указаны в самом конце теста, я считаю, что это упрощает чтение и понимание тестов. Это также помогает новичкам избегать множественных утверждений (где они будут устанавливать ожидания во многих вызовах или макетных объектах).

Раньше я использовал Rhino Mocks, и мне это очень понравилось, особенно после того, как был введен синтаксис AAA. Мне все же нравился свободный API Moq. То, что мне не нравилось с Moq, было «макетным объектом», где вы должны использовать mock.Object везде, мне нравится подход Rhino с «естественными» маками лучше. Каждый экземпляр выглядит и выглядит как обычный экземпляр поддельного типа. Я хотел лучшего из обоих миров, а также хотел посмотреть, что я могу сделать с синтаксисом, когда у меня были абсолютно свободные руки. Лично я (очевидно) думаю, что я создал что-то хорошее, что хорошо сочетается с лучшими из мира, но это довольно легко, когда вы стоите на плечах гигантов.

Как уже упоминалось, одно из основных отличий заключается в терминологии, FakeItEasy была впервые создана для того, чтобы ввести TDD и насмехаться перед новичками и беспокоиться о различиях между mocks и заглушками спереди (так, как вы должны были бы в Rhino), по моему мнению, не очень полезно.

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

FakeItEasy имеет некоторые функции расширяемости, которые другие структуры не имеют, но они еще не очень хорошо документированы.

FakeItEasy (надеюсь) немного сильнее в насмешливых классах, у которых есть аргументы конструктора, так как у него есть механизм для разрешения используемых фиктивных значений. Вы даже можете указать свои собственные определения фиктивных значений, внедряя класс DummyDefinition (Of T) в свой тестовый проект, это автоматически будет подхвачено FakeItEasy.

Синтаксис - очевидная разница, которая лучше всего во многом зависит от вкуса.

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

+27

+1 ничто не сравнится с сообщением автора :-) – TheCodeJunkie

+1

Спасибо @Patrick! отличный ответ, это действительно помогает понять аргументы за проектом, вы должны добавить что-то подобное в вики, для людей, которые уже используют фреймворк и могут быть заинтересованы в переключении :) Кстати, у вас есть dogfood FIE с вашим собственным производственным кодом ? –

+2

Да, мы досуга FakeItEasy на моем рабочем месте в крупномасштабных проектах, делали это уже более года. –

23

Терминология, используемая при тестировании, может быть несколько запутанной. Лучший источник, объясняющий разницу между различными понятиями, - это Mocks Aren't Stubs от Мартина Фаулера. Таким образом, fake - это общий термин, описывающий как заглушки, так и mocks.

+5

Lol любой вопрос с ложным или фальшивым тегом должен появиться «прочитал ли вы статью Мартина Фаулера»: P –

+1

Эта ссылка действительно имеет лучшие определения для этих терминов – softveda

+0

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

9

Терминология в насмешках может быть запутанной - и иногда совершенно неинтуитивной.

Поэтому многие люди предложили простую, новую терминологию, в которой у вас есть только подделок, издевается и заглушек.

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

Помимо этого, подделки отличаются только одним измерением: влияют ли они на результат теста или нет; или, другими словами: нужно ли устанавливать возвращаемые значения для подделки, которые каким-то образом используются во время выполнения теста, или это объект silent ', который служит только для выполнения некоторой зависимости.

Заглушка это то, что 'молчит' объект.

Mock это активно участвует в выполнении теста

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

Что касается сравнения между Moq и FakeItEasy: две рамки в основном совпадают с концептуальной точки зрения - различия только в API и в терминологии ...

Томас

+0

* Кто * предложил терминологию, где «подделка является общим термином»? Я знаю, что библиотека FakeItEasy использует его так, но это все. Каждый другой автор (Fowler, Meszaros, создатели других издевательских библиотек) либо использует «подделку» для отдельного типа тестового двойника (отличного от обоих заглушек и mocks), либо вообще не использует это имя (например, нет ничего названный «подделкой» в jMock, EasyMock или Mockito). –

-2

С моей точки зрения Факэ не отменяет MOC, например я использую Dev Волшебное Fake фальсифицировать DAL и бизнес слоя и в то же время я использую Mock в MVC, чтобы для HttpContext

var repoistory = new FakeRepository<ProductTypeForm, VendorForm>(); 
      repoistory.Save(productTypeForm); 
      this.FillDropDown(new FakeRepository<VendorForm>()); 

В предыдущий код Dev Волшебное Поддельный сохранит ProductTypeForm и получить VendorForm от Dev Волшебного Фальшивого и связать его с ProductTypeForm, это операция сохранения может быть постоянным

для получения дополнительной Информации по о Dev магии Факэ увидеть его на CodePlex: http://devmagicfake.codeplex.com

Те испытания этого метода мы Have издеваться контексте HTTP

var context = new Mock<HttpContextBase>(); 
var request = new Mock<HttpRequestBase>(); 

Так я работаю с подделкой и издеваться

+0

Вы, кажется, больше заинтересованы в рекламе своего собственного проекта, а не в ответе на вопрос ... – SamuelKDavis

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