Rhino Mocks: методы Do и Callback - CodeHelper

Rhino Mocks: методы Do и Callback

2

В чем отличие методов Do и Callback в Rhino Mocks? Для чего они нужны и когда их следует использовать?

Лучший ответ:

1

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

Callback

Callback — это метод, позволяющий пользователю определить делегат, который будет вызываться каждый раз при проверке взова метода на «ожидаемость». Это полезно, когда нужно провести сложную проверку параметров метода или когда параметры метода должны как-то взаимодействовать с контекстом теста.

То что нужно иметь в виду при использовании callback:

  • Делегат, который передается в метод callback, должен возвращать booltrue если аргументы метода прошли валидацию. Если же валидация не пройдена, верните 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()

v1.7.123.556
© 2009—2010 CodeHelper FAQ | О сайте | Обратная связь | История изменений | Статьи
Creative Commons LicenseМатериалы сайта распространяются под лицензией Creative Commons Attribution-Share Alike 3.0 Unported.