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

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

Update:

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

Разница между окурками и mocks

Вы можете получить фактическое определение этих терминов в этой статье: Mocks Are not Stubs. Я хочу сосредоточиться на различии с точки зрения Rhino Mocks.

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

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

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

Ответ 1

По this

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

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

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

Ответ 2

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

Столбики

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

Mocks

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

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

Подводя итог

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

Насколько важна эта разница?

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

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

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

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

Ответ 3

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

Ответ 4

В случае платформы Moq - метод установки - это STUB, где, поскольку метод Verify - Mock

Ответ 5

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