在Rhino Mock中,如何模拟属性可以多次“调用”?

时间:2011-11-16 17:00:52

标签: .net mocking rhino-mocks

这应该很简单,所以我必须遗漏一些东西(很有可能因为这是我第一次使用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 个答案:

答案 0 :(得分:1)

尝试生成模拟

MockRepository.GenerateMock<IHelm>()

而不是Stub:

Stub<IHelm>()

The difference between stubs and mocks Rhino Mocks在线文档

  

模拟是一个我们可以设定期望的对象,以及将要设置的期望   验证确实发生了预期的操作。存根是一个   您用于传递给测试代码的对象。您可以   设定对它的期望,所以它会以某种方式行动,但那些   期望永远不会得到验证。 存根的属性会   自动表现得像普通属性,你无法设置   对他们的期望

答案 1 :(得分:1)

要说我不认为模拟真的是你想要的。您没有设定期望值,因此您可以致电VerifyAllExpectations以确保调用某些预期的内容。在大多数情况下,我认为这是一个不重要的区别,你在这里的测试应该使用模拟或存根。

仅仅为了后人和未来寻求者看到这个问题,当您使用静态方法MockRepository.GenerateMock<IHelm>()而不是实例mocks.Stub<IHelm>()时,导致不同结果的原因就是您使用的那种不同的方法。您可以轻松使用MockRepository.GenerateStub<IHelm>()。这里的答案实际上并没有与mock和stub之间的区别有关。您的问题与设定期望无关。