重用经过验证的模拟

时间:2010-10-25 22:56:30

标签: c# rhino-mocks

我正在按照this帖子中的ayende所描述的那样对犀牛嘲笑进行预期。我的代码看起来像这样:

using (_mocks.Ordered())
  {
    Expect.Call(() => _myMock.CallA());
    Expect.Call(() => _myMock.CallB(40));
    Expect.Call(() => _myMock.CallA());
  }
  _mocks.ReplayAll();
  _myObjectUnderTest.DoStuff();
  _mocks.VerifyAll();

在此之后,我想添加更多期望并测试更多我的对象的方法。我想这样做是因为我有一些基本的测试方法可以对我的测试对象进行一些设置,而且我不想重新测试那个功能,所以我只是调用早期的测试方法。如果我在VerifyAll()之后尝试添加更多期望,我会得到一个异常:“当模拟对象处于验证状态时,此操作无效。”

我的部分问题是我并不真正了解所有重播/验证内容的作用,我只是复制了代码。我正在使用严格的模拟,因此任何设置代码必须具有匹配的期望或失败。我不想复制我的设置代码的期望。

有没有办法重置模拟以某种方式重新开始?

2 个答案:

答案 0 :(得分:4)

简答:不。现在回答很久。

重播和验证的内容是什么。在你致电ReplayAll之前,你告诉Rhino你期望这些方法做什么。在某种意义上,您正在记录对您创建的模拟对象的调用。

在你录制方法调用之后,你打电话给ReplayAll告诉Rhino你现在要做'某事'应该执行记录的方法。

最后,您致电VerifyAll要求Rhino验证这些方法是否在您录制时实际调用。

现在为什么你真的不想重复使用模拟。通过单元测试/ TDD,您的单元测试应尽可能少地进行测试。这是为了使您的单元测试简单透明。单元测试的整个想法是,许多很多小测试作为一个整体测试整个系统。

有关TDD解释此主题和其他主题的非常好的演示,请参阅http://www.infoq.com/presentations/integration-tests-scam

P.S。:一个小细节:只要方法不返回结果,您就可以写:

using (_mocks.Ordered())
{
    Expect.Call(() => _myMock.CallA());
    Expect.Call(() => _myMock.CallB(40));
    Expect.Call(() => _myMock.CallA());
}

为:

using (_mocks.Ordered())
{
    _myMock.CallA();
    _myMock.CallB(40);
    _myMock.CallA());
}

(至少使用最新版本的Rhino)

答案 1 :(得分:1)

简答:是的

更长的答案:尝试以下

    [Test]
    public void RhinoMock_PerformMultipleChecks()
    {
        var myMock = MockRepository.GenerateDynamicMockWithRemoting<IComparable>();

        // first round of checks
        myMock.Expect(x => x.CompareTo("123")).Return(1);
        myMock.Expect(x => x.CompareTo("-12")).Return(-1);
        Assert.AreEqual(1, myMock.CompareTo("123"));
        Assert.AreEqual(-1, myMock.CompareTo("-12"));
        myMock.VerifyAllExpectations();

        // reset
        myMock.BackToRecord();
        myMock.Replay();

        // next round of checks
        myMock.Expect(x => x.CompareTo(1.23)).Return(1);
        myMock.Expect(x => x.CompareTo(-12)).Return(-1);
        Assert.AreEqual(1, myMock.CompareTo(1.23));
        Assert.AreEqual(-1, myMock.CompareTo(-12));
        myMock.VerifyAllExpectations();

        // reset
        myMock.BackToRecord();
        myMock.Replay();

        // final round of checks
        myMock.Expect(x => x.CompareTo(1.23m)).Return(1);
        myMock.Expect(x => x.CompareTo(-12m)).Return(-111);
        Assert.AreEqual(1, myMock.CompareTo(1.23m));
        Assert.AreEqual(-111, myMock.CompareTo(-12m));
        myMock.VerifyAllExpectations();
    }