Если я могу вызвать метод AssertWasCalled для заглушки, в чем разница между макетом и заглушкой? - PullRequest
0 голосов
/ 22 декабря 2011

Насколько я знаю, заглушка - это просто замена зависимости. Заглушка не используется для проверки и не может пройти проверку - из книги «Искусство модульного тестирования».

Но, похоже, с Rhino Mocks 3.5 я могу сделать это:

var service = MockRepository.GenerateStub<ILuckyService>(); 
service.AssertWasCalled(s=>s.GetLuckyNumberOfTheDay());

Если вы можете проверить, вызывается ли метод для заглушки, то зачем мне беспокоиться, если мне нужно использовать заглушку или макет?

Ответы [ 5 ]

3 голосов
/ 22 декабря 2011

Используйте статью Мартина Фаулера в качестве общего справочника в вашей команде.Это различие важно для читателей вашего теста: когда я вижу заглушку, я игнорирую ее и продолжаю.

  • Заглушка только для того, чтобы ваш тест работал (методы NOP / вернуть некоторые консервированныезначение).Это не фокус теста, скорее случайная деталь.(Хотя это обязательная деталь / зависимость для вашего тестового сценария)
  • С другой стороны, макет - это ваш основной фокус ... вы хотите проверить, привели ли ваши действия к ожидаемым ожиданиям (насмешливым)Зависимость.

Это мое мнение.Даже если Rhino Mocks позволяет вам сделать это, я бы не стал утверждать о заглушке.

1 голос
/ 22 декабря 2011

Я всегда стараюсь использовать заглушки.Разница между заглушками и Mocks (с точки зрения RM) заключается в том, что заглушка НИКОГДА не вызовет исключение во время вызова.Моды (особенно строгие) будут генерироваться немедленно, если вызов выполняется с другими аргументами, чем ожидалось.Также вы можете проверить ожидания, сделанные только на насмешках, а не окурки.

Другая дилемма заключается в том, что использовать: Expect.Call() или SetupResult.For() (я склонен использовать последнее).Но я согласен, что все это богатство бесполезно в большинстве сценариев.Вот почему я предпочитаю Stubs.

Однако я бы порекомендовал взглянуть на Nsubstitute - в нем нет всего этого бардака и очень выразительный синтаксисПросто взгляните на несколько примеров, и вы сразу же полюбите их:)

1 голос
/ 22 декабря 2011

На самом деле поведение классов Mock и Stub в RhionMocks такое же, и это может сбивать с толку даже для создателя RhinoMocks .
Но поскольку между stub и mock есть принципиальная разница, выбор одного из них с помощью Rhino Mocks делает ваши намерения кода более ясными.
Когда вы создаете заглушку, вы просто не хотите, чтобы ваш тест проваливался при вызовах методов заглушки (например, когда вы используете какой-либо объект Log).
Когда вы создаете Mock, вы хотите убедиться, что ваш код использовал предоставленный объект так, как вы ожидали (например, запись правильных данных в базу данных).

0 голосов
/ 22 декабря 2011

Заглушка или макет являются понятиями.Вы можете создать заглушку и использовать ее как макет и наоборот.Я настоятельно рекомендую прочитать эту статью - http://martinfowler.com/articles/mocksArentStubs.html

0 голосов
/ 22 декабря 2011
...