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建议的形式)而不是实例,这是可行的。