我遇到了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.
有谁知道,我做错了什么?
提前致谢!
答案 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()