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

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

Обновление:

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

Разница между заглушками и макетами

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

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

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

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

Ответы [ 5 ]

145 голосов
/ 21 января 2009

Согласно это

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

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

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

20 голосов
/ 05 января 2017

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

Заглушки

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

Mocks

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

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

Подводя итог

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

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

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

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

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

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

7 голосов
/ 07 ноября 2012

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

5 голосов
/ 18 сентября 2014

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

0 голосов
/ 07 июля 2015

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

...