Хитрость заключается в том, чтобы использовать Repeat.Times (n), где n - количество раз.
Удивительно, что приведенный ниже тест пройдет, даже если метод вызывается чаще, чем ожидалось:
[Test]
public void expect_repeat_n_times_does_not_work_when_actual_greater_than_expected() {
const Int32 ActualTimesToCall = 6;
const Int32 ExpectedTimesToCall = 4;
var mock = MockRepository.GenerateMock<IExample>();
mock.Expect(example => example.ExampleMethod()).Repeat.Times(ExpectedTimesToCall);
for (var i = 0; i < ActualTimesToCall; i++) {
mock.ExampleMethod();
}
// [?] This one passes
mock.VerifyAllExpectations();
}
Чтобы обойти это, используйте следующий метод:
[Test]
public void aaa_repeat_n_times_does_work_when_actual_greater_than_expected() {
const Int32 ActualTimesToCall = 6;
const Int32 ExpectedTimesToCall = 4;
var mock = MockRepository.GenerateMock<IExample>();
for (var i = 0; i < ActualTimesToCall; i++) {
mock.ExampleMethod();
}
// This one fails (as expected)
mock.AssertWasCalled(
example => example.ExampleMethod(),
options => options.Repeat.Times(ExpectedTimesToCall)
);
}
Источник: http://benbiddington.wordpress.com/2009/06/23/rhinomocks-repeat-times/ (см. Объяснение)
РЕДАКТИРОВАТЬ: редактируется только вПодводя итог, спасибо за полезный ответ.