Зачем мне нужно Replay () при создании заглушки для функции с Rhino Mocks? - PullRequest
7 голосов
/ 24 февраля 2012
var contextChannel = this.MockRepository.Stub<IContextChannel>();
var context = this.MockRepository.Stub<IOperationContext>();
context.Stub(x => x.Channel).Return(contextChannel);
context.Replay();

Для чего нужно воспроизведение?

Я понимаю, что в случае записи, а затем воспроизведения действия необходим вызов Replay ().Но мне непонятно, почему я вынужден написать еще одну строчку кода в случае, когда я ничего не записываю.Все, что мне нужно, это свойство, которое возвращает мой объект.

Ответы [ 3 ]

7 голосов
/ 24 февраля 2012

Обновление:

Вы неправильно используете синтаксис AAA. Вам больше не нужен экземпляр для MockRepository (он использовался для Rhino до 3.5). Просто вызовите статические методы в MockRepository:

var contextChannel = MockRepository.GenerateStub<IContextChannel>();
var context = MockRepository.GenerateStub<IOperationContext>();
context.Stub(x => x.Channel).Return(contextChannel);

Вот некоторая документация:

Оригинальный ответ

Вы не делаете. В таких ситуациях больше не нужно звонить Replay.

В предыдущих версиях существовала парадигма «запись-воспроизведение», в которой вы записывали ожидания и воспроизводили их во время теста. Он был заменен синтаксисом AAA, где вы можете намного проще и гибче настраивать макеты.

За кулисами все еще сохраняется состояние записи и воспроизведения макета. Такие методы, как Stub, переводят макет в состояние записи, настраивают его и возвращают в запись. Вам не нужно явно звонить Record в этих случаях.

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

mock.BackToRecord(BackToRecordOptions.All);
mock.Replay();
1 голос
/ 03 июля 2015

Ответ удален из вопроса:

var repo = new MockRepository();
var stubbedInterface = repo.Stub<IAnInterface>();
stubbedInterface.Stub(x => x.SomeProperty).Return(someValue);

Последняя строка здесь переводит хранилище в состояние записи, тем не менее, это простая заглушка.Таким образом, Replay необходимо.Для шаблона AAA следует использовать другой синтаксис:

var stubbedInterface = MockRepository.GenerateStub<IAnInterface>();
stubbedInterface.Stub(x =>SomeProperty).Return(someValue);
1 голос
/ 24 февраля 2012

До вызова метода Replay макеты RhinoMocks находятся в состоянии записи.Это означает, что вы можете контролировать поведение макета, даже если вы ничего не записываете сами по себе, вы все равно говорите макету , как вести себя isomg, например Stub.Вызов Replay останавливает ваш тест от изменения поведения макета и начинает фактически вести себя, как вы указали.

ОБНОВЛЕНИЕ

Метод Record существует только дляразрешить тестам перевести фиктивный объект обратно в состояние записи и изменить поведение макета.Я настоятельно рекомендую против этого.Обычно я просто использую методы MockRepository.ReplayAll() и MockRepository.VerifyAll().

...