2012-09-10 45 views
5

如果可以使用mock.Stub()。Return()來更改Rhino Mocks中的模擬行爲,爲什麼我們仍然需要存根?Rhino Mocks - 我們真的需要存根嗎?

我們總是使用MockRepository.GenerateMock()會失去什麼?

使用Mocks而不是存根的一大好處是我們可以在所有測試中重複使用同一個實例,保持它們更簡潔明瞭。

moq框架以類似的方式工作......我們沒有用於模擬和存根的不同對象。

(請不要使用鏈接到福勒的回答「嘲笑不是存根」一文)

回答

3

有一個非常明確的答案in the documentation

有模擬的是一個對象,我們可以設置預期,並且將確認預期的行動確實發生了。存根是一個 對象,您將其用於傳遞給待測代碼。你可以設置 對它的期望,所以它會以某種方式行事,但那些期望永遠不會被驗證。存根的屬性 將自動錶現得像普通屬性,並且不能對其設置 期望值。

如果你想驗證被測代碼的行爲,你將使用一個具有適當期望的模擬,並驗證。如果你想只傳遞一個值,可能需要以某種方式行事,但 不是這個測試的焦點,你將使用一個存根。

重要提示:存根永遠不會導致測試失敗。

+0

這是存根與模擬的概念,但正如我在質詢時說,你可以使用作爲犀牛的存根嘲弄。所以,回到我的問題,有兩個單獨的對象有什麼好處?我們總是使用MockRepository.GenerateMock()會失去什麼? –

+0

是的,你*可以*使用模擬作爲存根。但是,如上所述,如果您不想讓您的模擬影響測試結果,請使用存根。 –

+0

你能解釋一下爲什麼嗎?如何顯示一些代碼來證明你的論點? –

6

請記住,犀牛不再開發。較新的框架完全放棄這個模擬存根差異,他們測試推出單項雙打

moc的進化國王框架似乎將推向「一個通用實體」,而不是根據測試用例上下文分開不同的。

要了解更多的分離(模擬,存根,假)如何起源和目的是什麼方式送達的,我建議您閱讀文章Mark Seemann'scontinuum of test doubles

在一個極端你會發現絕對假人沒有實現,另一端是完整的生產實現。假人和生產實現都是明確定義的,但存根,間諜和假貨更難以確定:測試間諜什麼時候變成假的?此外,嘲笑在連續統中居住的時間間隔相當大,因爲它們在某些情況下可能相當複雜,但在其他情況下則非常簡單。


可能看起來犀牛並不模擬和存根區分,但也有細微的差別。例如,考慮存根屬性獲取器:

var mock = MockRepository.GenerateMock<IService>(); 
mock.Stub(m => m.Property).Return(42); 

這就是當對象模擬時你必須這麼做的方法。在另一方面存根,介紹財產語義,這淡化整個事情:

var stub = MockRepository.GenerateStub<IService>(); 
stub.Property = 42; 

儘管這是一個的來我的心靈在這一刻只有一個,可能會有更多一些。但是,這些只是細微的差別。

1:作爲2013年5月19日,這可能不再成立:Rhino Mocks new home

+0

我在一些項目中使用了moq,我喜歡!但是現在我正在開發一個使用Rhino的項目......所以,我試圖理解爲什麼我們不能忘記這些Stubs,並且像這個moq一樣使用Mock來實現這個框架。 –

+0

順便說一句,分享文章tks ...我會看看! –

+1

@MarceloOliveira:我很確定Rhino是否被開發出來,我們不會有兩種不同的類型。總的來說,你是對的,存根和模擬之間沒有太大的區別。然而,**有一些(雖然很小)。例如,查看我更新的答案。 –