2011-11-16 49 views
3

这应该是容易的,所以我必须失去了一些东西(很可能因为这是用犀牛模拟我的第一次)在Rhino Mock中,我如何嘲笑一个属性可以多次“调用”?

我只希望我的代码能够调用helm.CurrentEnterprise任意次数,而是我得到:

System.InvalidOperationException occurred 
    Message=Previous method 'IHelm.get_CurrentEnterprise();' requires a return value or an exception to throw. 
    Source=Rhino.Mocks 
    StackTrace: 
     at Rhino.Mocks.Impl.RecordMockState.AssertPreviousMethodIsClose() 
     at Rhino.Mocks.Impl.RecordMockState.MethodCall(IInvocation invocation, MethodInfo method, Object[] args) 
     at Rhino.Mocks.MockRepository.MethodCall(IInvocation invocation, Object proxy, MethodInfo method, Object[] args) 
     at Rhino.Mocks.Impl.RhinoInterceptor.Intercept(IInvocation invocation) 
     at Castle.DynamicProxy.AbstractInvocation.Proceed() 
     at IHelmProxy44ecadd4f07244fd96c5849febe94a58.get_CurrentEnterprise() 
     at KSS.PS3.Testing.UnitTests.ModelOptions.RuleGroupTreeViewTest.AsUsedByRuleGroupModalOptionEditor() in D:\dev\5.0.0\main\Application\Testing\Tests\UnitTests\ModelOptions\RuleGroupTreeView.cs:line 54 
    InnerException: 

这是我的代码:

MockRepository mocks = new MockRepository(); 
    IHelm helm = mocks.Stub<IHelm>(); 
    helm.Stub(x => x.CurrentEnterprise).Return(enterprise).Repeat.Any();   

    var a2 = helm.CurrentEnterprise; 
    var a2a = helm.CurrentEnterprise; // <- the exception comes from here 
    var a2aa = helm.CurrentEnterprise; 
+2

你可以尝试一样,但使用'MockRepository.GenerateMock ()'而不是'存根()'? – sll

+1

@sll,thanks MockRepository.GenerateMock ();工作。请你可以把你的评论变成答案,这样我就可以接受它,解释GenerateMock的工作方式,但不是存根(stub)会使它成为一个很有用的答案。 –

回答

1

尝试生成素

MockRepository.GenerateMock<IHelm>() 

而不是存根:

Stub<IHelm>() 

The difference between stubs and mocks犀牛嘲笑在线文档

有模拟的是一个对象,我们可以设置期望,这将 验证预期的操作确实发生过。存根是一个 对象,您将其用于传递给待测代码。你可以设置 对它的期望,所以它会以某种方式行事,但那些期望永远不会被验证。 存根的属性会自动 行为像正常的属性,也不能对其设置 预期

1

得说,我不认为一个模拟的真的是你想要的这里。你没有设定期望值,所以你可以拨打VerifyAllExpectations来调用某些期望的东西。我认为在大多数情况下这是一个不重要的区别,你在这里的测试应该与模拟或者存根一起工作。

只是为了后人和未来的求职者看这个问题,当你使用静态方法MockRepository.GenerateMock<IHelm>()而不是实例mocks.Stub<IHelm>()时,不同结果的原因就是 - 你使用了不同的方法。你可以很容易地使用MockRepository.GenerateStub<IHelm>()。这里的答案并不完全涉及模拟和存根之间的区别。你的问题与设定期望没有任何关系。