Rhino Mocks: Repeat.Once() не работает?

Может ли кто-нибудь сказать мне, почему в мире следующий тест не терпит неудачу?

[Test]
public void uhh_what() {
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>();
    a.Expect(x => x.Notify()).Repeat.Once();
    a.Notify();
    a.Notify();
    a.VerifyAllExpectations();
}

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

Ответы

Ответ 1

В группе RhinoMocks уже существует поток .

GenerateMock создает динамический макет. Динамический макет позволяет вызовам, которые не указаны (= ожидается). Если это произойдет, оно просто возвращает значение null (или значение по умолчанию для типа возврата).

Примечание: Repeat - это спецификация поведения (например, Stub), а не ожидание, даже если оно указано в ожидании.

Если вы хотите избежать более определенного количества вызовов, вы можете написать:

[Test]
public void uhh_what() 
{
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>();
    a.Expect(x => x.Notify()).Repeat.Once();
    a.Stub(x => x.Notify()).Throw(new InvalidOperationException("gotcha"));
    a.Notify();

    // this fails
    a.Notify();

    a.VerifyAllExpectations();
}

или

[Test]
public void uhh_what() 
{
    var a = MockRepository.GenerateMock<IPrebuiltNotifier>();
    a.Notify();
    a.Notify();

    // this fails
    a.AssertWasCalled(
      x => x.Notify(), 
      o => o.Repeat.Once());
}

Ответ 2

При использовании GenerateMock (или с Dynamic Mocks в целом) я всегда мысленно вставляю следующее:

a.Expect(x = > x.Notify()) Повторите. * [AtLeast] * Once();