2010-09-08 51 views
12

我在單元測試中給出的任何閱讀或建議總是暗示了模擬和存根的定義之間的明顯區別。我現在的這些定義的理解有如下單元測試模擬/存根定義在Moq

模擬:將在 測試被用來分離假:一個將在 測試被用來做最後的斷言

存根假依賴但 不被斷言

但是,Moq似乎只允許創建Mocks。框架中的存根命名空間似乎被貶低,建議使用Mock.SetupXXX。

我是否錯過了我對此的理解?還是有一個普遍的理解,一個模擬對象實際上可以作爲一個存根來使用?

也許我很迂腐,這只是我總是發現編程中的語言非常嚴格,並且更願意正確使用它,尤其是當其他開發人員可能接管項目時。

回答

14

按照Moq project site,起訂量爲:

了一個簡單的MockBehavior枚舉(無需瞭解什麼是模仿,存根,假的,動態模擬之間的理論差異模擬行爲進行細粒度控制等)

嘲笑,存根之間缺乏區別是一個故意的設計決定;一個我喜歡的設計決策。如果我需要一個true模擬,我打電話Verify()就可以了。如果沒有,沒有Verify()。我喜歡簡單,我還沒有發現自己錯過了mockstub之間的區別。

2

imho它只是它的一種愚蠢的討論。

重要的是,你使用模擬/存根來斷言你在測試中需要什麼,並且不要斷言你不知道什麼。

+1

我不同意eglasius。測試應該非常容易閱讀,消化和理解其他開發人員正在執行的操作。語言在這方面起着舉足輕重的作用。 – WDuffy 2010-09-08 22:57:34

+0

@WDuffy肯定,但我看到的方式是已經在測試代碼中清楚地傳達了這些信息。 – eglasius 2010-09-08 23:11:04

+0

從模擬中區分存根對於向知道測試的讀者指示哪些消息與附帶的(存根) – Gishu 2011-09-06 10:40:02

9

Martin Fowler寫了一篇好文章,Mocks Aren't Stubs,我認爲這個區別很明顯。

Mocks用於行爲驗證,而存根提供假數據並且通常參與狀態驗證。

+0

的當前測試(期望)相關,但是行爲驗證與涉及的數據相關,即使該數據以不同的方式持有。當然,這些條款是明確定義的,但這並不意味着它在這種區分明顯模糊的情況下不保證是靈活的。 – eglasius 2010-09-09 20:08:26

+1

@eglasius當然。我對圖書館沒有任何問題,即使我想將它作爲存根使用,但我認爲它向我提供了所謂的模擬。我只需將該變量正確地命名以供我使用。 – 2010-09-09 20:24:14

+0

+1肯定同意,如果團隊認爲其重要的溝通區別,變量的命名將清除。 – eglasius 2010-09-09 20:30:51

0

事實上,Moq可以創建真正的存根。從Moq Quick Start page

* Setup a property so that it will automatically start tracking its value (also known as Stub): 

    // start "tracking" sets/gets to this property 
    mock.SetupProperty(f => f.Name); 

    // alternatively, provide a default value for the stubbed property 
    mock.SetupProperty(f => f.Name, "foo"); 


    // Now you can do: 

    IFoo foo = mock.Object; 
    // Initial value was stored 
    Assert.Equal("foo", foo.Name); 

    // New value set which changes the initial value 
    foo.Name = "bar"; 
    Assert.Equal("bar", foo.Name); 

* Stub all properties on a mock (not available on Silverlight): 

    mock.SetupAllProperties(); 

恕我直言,假貨的味道之間的區別是函數的假貨作爲區分之間最好的思想,而不是類型假貨,爲假冒的可採取的多重角色一次(例如,可以一次成爲一個真正的模擬和破壞者),並且使用模擬框架不需要這種區分。 (我應該在這個博客!)