2011-11-16 51 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>()。這裏的答案並不完全涉及模擬和存根之間的區別。你的問題與設定期望沒有任何關係。