C# Rhino Mocks:ExpectationViolationException尽管调用按预期顺序进行
我对犀牛模仿有点问题。我的测试方法如下所示:C# Rhino Mocks:ExpectationViolationException尽管调用按预期顺序进行,c#,.net,rhino-mocks,C#,.net,Rhino Mocks,我对犀牛模仿有点问题。我的测试方法如下所示: MockRepository mocks = new MockRepository(); IServiceCalls serviceCallsMock = mocks.StrictMock<IServiceCalls>(); _controller.ServiceCalls = serviceCallsMock; using (mocks.Record())
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);
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()
有人知道我做错了什么吗
提前谢谢 首先-尝试使用语法,这更容易其次,在设定期望值并开始实际测试后,应进入重播状态,如下所示:
using (mocks.Playback()) { _controller.Index() }
3.5语法应该是这样的:
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);
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()
MockRepository mocks=new MockRepository();
IServiceCalls serviceCallsMock=MockRepository.GenerateMock();
_controller.ServiceCalls=serviceCallsMock;
Expect(x=>x.GetX(2)).Return(新列表{newx{Id=1});
_controller.Index();
serviceCallsMock.verifyAllExpections()
首先-尝试使用语法,这更容易其次,在设定期望值并开始实际测试后,应进入重播状态,如下所示:
using (mocks.Playback()) { _controller.Index() }
3.5语法应该是这样的:
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);
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()
MockRepository mocks=new MockRepository();
IServiceCalls serviceCallsMock=MockRepository.GenerateMock();
_controller.ServiceCalls=serviceCallsMock;
Expect(x=>x.GetX(2)).Return(新列表{newx{Id=1});
_controller.Index();
serviceCallsMock.verifyAllExpections()
问题出在这一行:
serviceCallsMock.SetX(new X{ Id = 2 });
mock现在正期望使用X
的这个实例调用您可能应该使用参数约束。试试像这样的东西
Is.Matching<X>(delegate(X) x
{ return x.Id == 2; } )
Is.Matching(委托(X)X
{返回x.Id==2;})
有关更多详细信息,请参阅。问题出在这一行:
serviceCallsMock.SetX(new X{ Id = 2 });
mock现在正期望使用X
的这个实例调用您可能应该使用参数约束。试试像这样的东西
Is.Matching<X>(delegate(X) x
{ return x.Id == 2; } )
Is.Matching(委托(X)X
{返回x.Id==2;})
有关更多详细信息,请参阅。Replayal在使用(mocks.Record())syntax时不是必需的。您确实需要以某种方式移动到播放状态。。。无论如何,3.5语法更容易,错误更少。在使用块结束时,它处于播放模式。这就是使用block的目的。当使用
使用(mocks.Record())
语法时,不需要使用Replayal。您确实需要以某种方式移动到播放状态。。。无论如何,3.5语法更容易,错误更少。在使用块结束时,它处于播放模式。这就是使用块的目的。为什么不使用Rhino3.5AAA语法?使用起来容易多了。为什么不使用Rhino3.5AAA语法呢?使用它要容易得多。为什么不干脆serviceCallsMock.SetX(Arg.Matches(x=>x.Id==2))代码>?谢谢大家!我现在使用约束匹配(以Stefan建议的形式)而不是实例,这很有效代码>?谢谢大家!我现在使用约束匹配(以Stefan建议的形式)而不是实例,这是可行的。