[mocking] 在Rhino Mocks上模擬和存根之間有什麼區別?



Answers

一般說來,單元測試調用函數和方法,然後檢查是否發生預期的行為。 這些函數和方法可能需要參數。 我們使用存根和模擬來滿足這些參數。 我們有時也會模擬全局對象。

存根

Stub是一個很小的假對象,您的測試可以用它作為參數來使函數調用起作用。 這讓我們驗證被測功能的行為。 它不會讓我們驗證任何副作用,因為存根沒有實現。

嘲弄

模擬是一個實現的存根。 如果我們的測試函數與我們的模擬對象相互作用,我們可以驗證模擬已經按照我們的預期進行了交互。

例如,假設我們有一個模擬用戶對象,並且我們想驗證我們的session.login方法是否有效,我們可能想要檢查是否設置了user.lastLoggedIn。 我們可以創建一個實現此方法的模擬用戶。 當我們調用session.login時,我們可以斷言user.lastLoggedIn具有我們所期望的狀態。

總結一下

模擬是一個實現的存根,它讓我們測試副作用。

這種差異仍然很重要嗎?

與明喻和隱喻之間的差異一樣,存根和嘲諷之間的差別是微妙的和歷史的,並且可能與測試世界中的不同社區和哲學有關,而不是任何主要的技術差異。

他們代表測試略有不同的方法。 模擬可以寫成像存根一樣。 存根通常可以擴展成模擬。

你應該使用哪個?

你可能會發現你開始創建存根,然後你可能會發現你需要為你的一些對象創建完整的模擬。 你可能想嘲笑一切,或者你可能只是想在需要的地方進行模擬。

Question

我還沒有充分玩這個,通常使用mock,但我不知道這兩者之間有什麼區別,以及何時在Rhino Mocks上使用其中一種。

更新:

我還用艾恩德的話找到了我的問題的答案:

存根和嘲諷之間的區別

您可以在本文中獲得這些術語的實際定義: Mocks不是存根 。 我想集中討論Rhino Mocks的不同之處。

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

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

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




在Moq框架的情況下 - 設置方法是STUB,其中Verify方法是Mock






Related