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

Являются ли подделки лучше, чем Mocks?

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

EDIT:

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

4b9b3361

Ответ 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>();

Итак, я работаю с подделкой и макетом