15

谁能告诉我为什么下面的测试没有失败?

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

真的需要第二双眼睛来确认我没有疯……现在我担心我所有的测试都不可靠。

4

2 回答 2

27

RhinoMocks 组上已经有一个线程。

GenerateMock 创建一个动态模拟。动态模拟允许未指定(=预期)的调用。如果发生这种情况,它只会返回 null(或返回类型的默认值)。

注意:重复是行为的规范(如 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());
}
于 2009-05-20T12:10:56.067 回答
9

当使用 GenerateMock(或一般的 Dynamic Mocks)时,我总是在脑海中插入以下内容:

a.Expect(x => x.Notify()).重复。*[至少] *Once();

于 2010-12-23T07:54:27.100 回答