Rhino Mocks:ExpectationViolationException虽然调用是预期的顺序

时间:2011-09-08 07:19:50

标签: c# .net rhino-mocks

我遇到了Rhino Mocks的问题。我的测试方法如下所示:

        MockRepository mocks = new MockRepository();
        IServiceCalls serviceCallsMock = mocks.StrictMock<IServiceCalls>();
        _controller.ServiceCalls = serviceCallsMock;

        using (mocks.Record())
        {
            serviceCallsMock.GetX(2);
            LastCall.Return(new List<X> { new X{ Id = 1 } });

            serviceCallsMock.SetX(new X{ Id = 2 });
        }

        _controller.Index();

        mocks.Verify(serviceCallsMock);

_controller.Index()方法中的调用顺序正确,参数正确。但是我得到了以下失败:

Rhino.Mocks.Exceptions.ExpectationViolationException
 IServiceCalls.SetX(Namespace.X); Expected #0, Actual #1.
 IServiceCalls.SetX(Namespace.X); Expected #1, Actual #0.

有谁知道,我做错了什么?

提前致谢!

2 个答案:

答案 0 :(得分:1)

问题出在这一行:

serviceCallsMock.SetX(new X{ Id = 2 });

现在期望使用X的这个实例调用模拟 你应该使用Argument Constraints。尝试像

这样的东西
Is.Matching<X>(delegate(X) x 
  { return x.Id == 2; } )

有关详细信息,请参阅Rhino Mocks Quick Reference

答案 1 :(得分:0)

首先 - 尝试使用Rhino Mocks 3.5语法,这样更容易 其次,在设定好您的期望并开始实际测试后,您应该进入重播状态:

using (mocks.Playback())   {   _controller.Index()   }

3.5语法应该是这样的:

    MockRepository mocks = new MockRepository();
    IServiceCalls serviceCallsMock = MockRepository.GenerateMock<IServiceCalls>();
    _controller.ServiceCalls = serviceCallsMock;
    serviceCallsMock.Expect(x => x.GetX(2)).Return(new List<X> { new X{ Id = 1 } });
    _controller.Index();
    serviceCallsMock.VerifyAllExpectations()