Каковы различия между насмешками и заглушками на носорогах Rhino?
Я не играю достаточно с этим и обычно использую mocks, но мне интересно, каковы различия между этими двумя и когда использовать один или другой на Rhino Mocks.
Обновить:
Я также нашел ответ на свой вопрос в словах Айенде:
Разница между окурками и издевательствами
Вы можете получить фактическое определение этих терминов в этой статье: издевательства не являются заглушками. Я хочу сосредоточиться на разнице с точки зрения Rhino Mocks.
Макет - это объект, на который мы можем установить ожидания и который проверит, что ожидаемые действия действительно произошли. Заглушка - это объект, который вы используете для передачи тестируемого кода. Вы можете настроить ожидания, чтобы они действовали определенным образом, но эти ожидания никогда не будут проверены. Свойства заглушки будут автоматически вести себя как обычные свойства, и вы не можете устанавливать на них ожидания.
Если вы хотите проверить поведение тестируемого кода, вы будете использовать макет с соответствующим ожиданием и подтвердите это. Если вы хотите просто передать значение, которое может действовать определенным образом, но не является целью этого теста, вы будете использовать заглушку.
ВАЖНО: заглушка никогда не приведет к сбою теста.
5 ответов
Согласно этому
... Проще говоря, между объектами Mock и Stub есть разница, и RhinoMocks признает, что это позволяет нам писать тесты, которые лучше определяют их назначение.
Поддельные объекты используются для определения ожиданий, т. Е. В этом сценарии я ожидаю, что метод A() будет вызываться с такими и такими параметрами. Издевается над записью и проверяет такие ожидания.
Заглушки, с другой стороны, имеют другую цель: они не записывают и не проверяют ожидания, а скорее позволяют нам "заменить" поведение, состояние "поддельного" объекта, чтобы использовать тестовый сценарий...
Вообще говоря, модульные тесты вызывают функции и методы, а затем проверяют, имело ли место ожидаемое поведение. Эти функции и методы могут требовать параметров. Мы используем заглушки и макеты, чтобы удовлетворить эти параметры. Иногда мы можем также высмеивать глобальные объекты.
Столбики
Stub - это крошечный поддельный объект, который ваш тест может использовать в качестве параметра, чтобы заставить вызов функции работать. Это позволяет нам проверить поведение тестируемой функции. Это не позволяет нам проверять какие-либо побочные эффекты, потому что заглушка не имеет реализации.
Mocks
Мок это заглушка с реализацией. Если наша тестируемая функция взаимодействует с нашим фиктивным объектом, мы можем убедиться, что с фиктивным взаимодействовали так, как мы ожидали.
Например, скажем, у нас был фиктивный объект User, и мы хотели убедиться, что наш метод session.login работал, мы могли бы проверить, что user.lastLoggedIn был установлен. Мы могли бы создать фиктивного пользователя, который реализует этот метод. Когда мы вызываем session.login, мы можем утверждать, что user.lastLoggedIn имеет ожидаемое состояние.
Подводить итоги
Макет - это заглушка с реализацией, которая позволяет нам тестировать побочные эффекты.
Эта разница все еще важна?
Точно так же, как разница между сравнениями и метафорами, разница между заглушками и имитациями тонкая и историческая и, возможно, больше связана с различными сообществами и философиями в мире тестирования, чем с какими-либо существенными техническими различиями.
Они представляют несколько разные подходы к тестированию. Макет может быть написан как заглушка. Заглушка обычно может быть превращена в макет.
Что вы должны использовать?
Вы можете обнаружить, что начинаете создавать заглушки, а затем вы можете обнаружить, что вам нужно создать макеты для некоторых ваших объектов. Вы можете издеваться над всем, как вы идете, или вы можете просто издеваться, где это необходимо.
Разница между Mock и заглушкой: с заглушкой вы исправляете ввод вашего модульного теста: таким образом, ваш модульный тест не делает утверждения на заглушке и заглушке, переписывая реализацию некоторого метода, исправляющего поведение поддельного объекта. с помощью Mock вы исправляете выходной сигнал вашего модульного теста: поэтому ваш модульный тест рассчитывает на ваш объект Mocking, проверяя внутреннее взаимодействие в вашем объекте Mock.
В случае Moq framework - метод установки STUB, где Verify метод Mock
Одна вещь, которую я также заметил, это то, что когда я использую MockRepository.GenerateMock, мне нужно явно установить ожидания для конкретного вызова метода, чтобы перехватить этот вызов. С заглушками, кажется, автоматически перехватывает любой метод, пока он является виртуальным.