В чем отличие методов Do и Callback в Rhino Mocks? Для чего они нужны и когда их следует использовать?
Rhino Mocks: методы Do и Callback
Лучший ответ:
Вот перевод документации:
Callback
Callback
— это метод, позволяющий пользователю определить делегат, который будет вызываться каждый раз при проверке взова метода на «ожидаемость». Это полезно, когда нужно провести сложную проверку параметров метода или когда параметры метода должны как-то взаимодействовать с контекстом теста.
То что нужно иметь в виду при использовании callback
:
- Делегат, который передается в метод
callback
, должен возвращатьbool
—true
если аргументы метода прошли валидацию. Если же валидация не пройдена, вернитеfalse
и Rhino Mocks отметит, что вызов метода не считается ожидаемым. - Тесты, использующие
callback
, легко могут стать трудночитаемыми. Поэтому пользуйтесь колбеками только в случае необходимости. - Делегаты
callback
могут (и, скорее всего, будут) вызваны несколько раз; имейте это в виду, когда пишете их код. Оберните необходимые действия вif ( firstTimeCalled ) { /*do work*/ }
или другим способом убедитесь, что повторный вызов не будет иметь побочных эффектов.
Технические детали — чтобы callback
считался вызвался корректно нужно чтобы он возвращал bool
и принимал те же параметры, что и исходный метод. Для регистрации делегата используется код:
IProjectRepository repository = mocks.CreateMock<IProjectRepository>();
IProjectView view = mocks.CreateMock<IProjectView>();
Expect.Call(view.Ask(null,null)).Callback(new AskDelegate(DemoAskDelegateMethod)).Return(null);
Имейте в виду — внутри колбека нельзя изменить возвращаемое значение метода, поэтому нужно указать его явно (используя Return(...)
)
Do
Иногда бывает, что возврат статичного значения из заглушки неприемлемо для сценария тестирования. Для таких случаев используется метод Do
чтобы добавить собственную логику генерации возвращаемого значения. Значение, возвращаемое делегатом метода Do
будет считаться возвращаемым значением метода (любые исключения также также учитываются). Сигнатура делегата должна совпадать с сигнатурой исходного метода.
Обработчик Do
вызывается только если соответствующий метод вызван. И он вызывается только один раз для этого метода. В этом отличие от Callback()