2014-03-28 182 views
3

玩弄犀牛嘲笑,我只是偶然發現了一個奇怪的行爲,我不明白。犀牛嘲笑 - MethodInvocation.ReturnValue與IMethodOptions.Return

設置我的存根的工作原理如下預期 - 42返回

var generator = MockRepository.GenerateStub<INumberGenerator>(); 
generator.Stub(x => x.GetNumber()).Return(42); 

然後我嘗試使用WhenCalled(Action<MethodInvocation> action)擴展,這是我到目前爲止只用於無效功能:

generator.Stub(x => x.GetNumber()).WhenCalled(mi => mi.ReturnValue = 42); 

此代碼引發了一個例外Method 'INumberGenerator.GetNumber();' requires a return value or an exception to throw.。好吧,我已經添加了.Return(55) - 現在事情開始變得怪異:

generator.Stub(x => x.GetNumber()).WhenCalled(mi => mi.ReturnValue = 42).Return(55); 

現在返回,而不是。請注意,MethodInvocation.ReturnValue只有適用於添加.Return(..)語句,然後對返回值完全沒有影響 - 這使我很困惑。任何人都可以解釋這種行爲嗎?

回答

3

犀牛製品需要指定在Expect()鏈的末端Return()通話(你的情況,當你爲你的存根設定期望),以便它能夠確定類型的返回結果的。

所以,實際上,只使用WhenCalled()的返回值。只要它屬於同一類型,Returns()中的任何值都會(並且不會被使用)。

我認爲在文檔中沒有明確提到。沒問題。

+0

沒錯。我總是這樣寫:'.Stub(...)。WhenCalled(...)/ *使Rhino高興* /。返回(0)'(多行,這在評論中是不可能的) –

+0

/*使犀牛快樂* /是一個該死的衝牀線肯定!總結犀牛的嘲笑...因此MoQ;) – Vandesh

+0

我認爲這不是太糟糕。 WhenCalled使用非常罕見。對於「正常」使用情況,重要的是要進行一些驗證。在這種情況下,Rhino不知道你已經在WhenCalled中指定了返回值。好的,它可能會假設它。 –