犀牛嘲笑:重复。一次()不工作?

时间:2009-05-20 10:42:07

标签: rhino-mocks

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

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

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

2 个答案:

答案 0 :(得分:25)

已经有thread on the RhinoMocks group

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());
}

答案 1 :(得分:9)

使用GenerateMock(或一般使用Dynamic Mocks)时,我总是在心理上插入以下内容:

a.Expect(x =&gt; x.Notify())。重复。 * [至少] *一次();