Можете ли вы объяснить разницу между StrictMock и Partialmock?

#c# #.net #unit-testing #rhino-mocks

#c# #.net #модульное тестирование #rhino-издевается

Вопрос:

Поскольку я использую RhinoMocks версии 3.6 и поскольку я не использую Record-Replay и поскольку я не вызываю методы проверки для утверждения в mocks;

Можете ли вы объяснить, в чем разница между очень просто?

 MockRepository.GenerateMock()
MockRepository.GeneratePartialMock()
MockRepository.GenerateStrictMock()
  

Примечание: я использую .Постоянно генерируйте MOCK для создания моих макетов, и я утверждаю вызовы методов, уже предоставляя ожидаемые аргументы.

Ответ №1:

Различия объясняются в этой статье

Если вы не создаете никаких ожиданий для a StrictMock , и метод вызывается в макете, будет выдано исключение.

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

Существует также нечто, называемое a DynamicMock . Если вы не создаете никаких ожиданий для a DynamicMock , и в макете вызывается метод, вызывается метод-заглушка. Если было возвращаемое значение, возвращается значение по умолчанию (например null , или 0 ).

GenerateMock Я считаю, что создает DynamicMock .

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

Смотрите эту статью: http://ayende.com/wiki/Rhino Mocks 3.5.ashx#CreateMockisdeprecated,replacedbyStrictMockTheuseofStrictMockisdiscouraged

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

Ответ №2:

Я должен добавить, что «использование Strict Mock не рекомендуется» словами Айенде. http://ayende.com/wiki/Rhino Mocks 3.5.ashx#CreateMockisdeprecated,replacedbyStrictMockTheuseofStrictMockisdiscouraged

Он говорит:

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

Я рекомендую вместо этого использовать заглушки и динамические макеты.