Являются ли подделки лучше, чем Mocks?
Я наткнулся на этот проект с открытым исходным кодом Fake It Easy, и я должен признать, это выглядит очень интересно, однако у меня есть сомнения, какова разница между подделками FIE и сказать Moq Mocks? Кто-нибудь лучше подходит для конкретных целей?
EDIT:
Что это за новая структура, которая сделает ее лучше, чем сказать Moq?
Ответы
Ответ 1
Чтобы быть ясным, я создал 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 в производстве, поэтому мои знания об этом ограничены), я думаю, что это самые важные различия, хотя.
Ответ 2
Терминология, используемая при тестировании, может быть немного запутанной. Лучший источник, объясняющий разницу между различными понятиями, - это Mocks Are not Stubs от Мартина Фаулера. Таким образом, подделка - это общий термин, описывающий как заглушки, так и макеты.
Ответ 3
Терминология в насмешках может сбивать с толку - и иногда совершенно неинтуитивно.
Поэтому многие люди предложили более простую новую терминологию, где у вас есть только подделки, mocks и заглушки.
Поддельный - это общий термин для всех возможных видов двойных тестов, независимо от того, откуда они берутся и как они используются.
Кроме того, подделки различаются только по одному измерению: влияют ли они на результат теста или нет; или, другими словами: нужно ли устанавливать возвращаемые значения для подделки, которые каким-то образом используются во время выполнения теста, или это "тихий" объект, который служит только для выполнения некоторой зависимости.
Stub - это "тихий" объект.
Mock активно участвует в выполнении теста
Кроме того, нет никакого другого различия, которое, несомненно, имеет свои исторические достоинства, но в настоящее время в значительной степени противоречит интуиции и академичности, и это своего рода запутывание действительно важных концепций развития, обусловленного испытаниями.
Относительно сравнения между Moq и FakeItEasy: две фреймворки в основном одинаковы с концептуальной точки зрения - различия существуют только в API и в терминологии...
Томас
Ответ 4
С моей точки зрения, Fake не отменяет Moc, например, я использую Dev Magic Fake для подделки DAL и уровня Business и в то же время я использую Mock в MVC для HTTPContext
var repoistory = new FakeRepository<ProductTypeForm, VendorForm>();
repoistory.Save(productTypeForm);
this.FillDropDown(new FakeRepository<VendorForm>());
В предыдущем коде Dev Magic Fake будет сохранять ProductTypeForm и извлекать VendorForm из Dev Magic Fake и связывать его с ProductTypeForm, эта операция сохранения может быть постоянной
Для получения дополнительной информации о Dev Magic Fake см. его в CodePlex:
http://devmagicfake.codeplex.com
Те проверяет этот метод, который нам нужен для перебора контекста HTTP
var context = new Mock<HttpContextBase>();
var request = new Mock<HttpRequestBase>();
Итак, я работаю с подделкой и макетом