这应该很简单,所以我必须遗漏一些东西(很有可能因为这是我第一次使用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;
答案 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之间的区别有关。您的问题与设定期望无关。