Каковы различия между насмешками и заглушками на носорогах Rhino?

149

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

Обновить:

Я также нашел ответ на свой вопрос в словах Айенде :

Различие между заглушками и имитаторами

Вы можете получить фактическое определение этих терминов в этой статье: Насмешки не являются заглушками . Я хочу сосредоточиться на разнице с точки зрения Rhino Mocks.

Макет - это объект, на который мы можем установить ожидания и который проверит, что ожидаемые действия действительно произошли. Заглушка - это объект, который вы используете для передачи тестируемого кода. Вы можете настроить ожидания, чтобы они действовали определенным образом, но эти ожидания никогда не будут проверены. Свойства заглушки будут автоматически вести себя как обычные свойства, и вы не можете устанавливать на них ожидания.

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

ВАЖНО: заглушка никогда не приведет к сбою теста.

Rismo
источник

Ответы:

148

Согласно этому

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

Поддельные объекты используются для определения ожиданий, т. Е. В этом сценарии я ожидаю, что метод A () будет вызываться с такими и такими параметрами. Издевается над записью и проверяет такие ожидания.

Заглушки, с другой стороны, имеют другую цель: они не записывают и не проверяют ожидания, а скорее позволяют нам «заменить» поведение, состояние «поддельного» объекта, чтобы использовать тестовый сценарий ...

rbrayb
источник
Я нашел еще один полезный пост, который повторяет то же сообщение, что и принятый ответ на этот вопрос - martinfowler.com/articles/mocksArentStubs.html .
singh1469
20

Вообще говоря, модульные тесты вызывают функции и методы, а затем проверяют, имело ли место ожидаемое поведение. Эти функции и методы могут требовать параметров. Мы используем заглушки и макеты, чтобы удовлетворить эти параметры. Иногда мы можем также высмеивать глобальные объекты.

Столбики

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

Mocks

Мок это заглушка с реализацией. Если наша тестируемая функция взаимодействует с нашим фиктивным объектом, мы можем убедиться, что с фиктивным взаимодействовали так, как мы ожидали.

Например, скажем, у нас был фиктивный объект User, и мы хотели убедиться, что наш метод session.login работал, мы могли бы проверить, что user.lastLoggedIn был установлен. Мы могли бы создать фиктивного пользователя, который реализует этот метод. Когда мы вызываем session.login, мы можем утверждать, что user.lastLoggedIn имеет ожидаемое состояние.

Подводить итоги

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

Эта разница все еще важна?

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

Они представляют несколько разные подходы к тестированию. Макет может быть написан как заглушка. Заглушка обычно может быть превращена в макет.

Что вы должны использовать?

Вы можете обнаружить, что начинаете создавать заглушки, а затем вы можете обнаружить, что вам нужно создать макеты для некоторых ваших объектов. Вы можете издеваться над всем, как вы идете, или вы можете просто издеваться, где это необходимо.

superluminary
источник
7

Разница между Mock и заглушкой: с заглушкой вы исправляете ввод вашего модульного теста: таким образом, ваш модульный тест не делает утверждения на заглушке и заглушке, переписывая реализацию некоторого метода, исправляющего поведение поддельного объекта. с помощью Mock вы исправляете выходные данные вашего модульного теста: так что ваш модульный тест рассчитывает на ваш объект Mocking, проверяя внутреннее взаимодействие в вашем объекте Mock.

Хасан Бутуга
источник
Вы, кажется, говорите, что ваш тест должен «проверить» вывод макета. Если это то, что вы говорите, вы не правы. Макет не должен быть проверен; это там, чтобы вы могли проверить другой код. Или ваше последнее предложение означает что-то еще?
Эндрю Барбер
1
Привет, Эндрю! Как я уже писал, с помощью Mock вы исправляете вывод теста, чтобы не проверять его. В противном случае я написал, что Mock позволяет вам проверять взаимодействие (ожидаемое поведение ... ;-)
Hassan Boutougha
1
ОК, это имеет больше смысла. Спасибо за разъяснения!
Эндрю Барбер
> не делает утверждения на заглушке Почему во многих библиотеках утверждений все еще существуют методы, известные should have been called withкак утверждение stubпараметров.
Хеллбой
5

В случае Moq framework - метод установки STUB, где Verify метод Mock

codebased
источник
0

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

Шон
источник