2011-07-18 131 views
0

所以,當我建立我的領域模型時,我試圖只暴露驅動行爲所需的必要條件,但我的單元測試要求我公開只是真正需要的公共獲取者類。大家怎麼處理這個?我的域名層只能通過我的應用服務層訪問,那麼真的是那麼大的一筆交易?我應該讓他們內部並給測試項目訪問?域模型(暴露公共屬性)

任何幫助將是偉大的!

回答

0

我與埃裏克的說法認爲,單元測試應該不會影響類的API。

在你情況,這聽起來像你的設計可能不是曲正確的。你在談論需要檢查私有變量的單元測試 - 但是應該使用公共API完全定義單元測試。

要麼分割你的對象,以便私有字段暴露在某一層(使對象更加細化),要麼改變你的測試不需要訪問這些私有字段(使你的單元測試更粗粒化)。

一個有用的工具是Code Contracts.您可以使用代碼合同定義非常細粒度的測試(後置條件和對象不變量,使用代碼合同定義),並使您的單元測試更粗糙一些。我的一些單元測試只能調用一個方法,並確保代碼合同不會觸發。

+0

我有一個Story類,方法調用Submit。在該方法中,我設置了一個提交日期屬性。現在,該屬性值不會在我的域圖層中的任何地方使用。但讀取圖層將其用於顯示目的。這有幫助嗎?將UI公開化爲UI的唯一原因。我的測試聲稱反對它,以確保它被正確設置。 – Marco

+0

@Marco如果屬性SubmittedOnDate是一個故事的屬性,將它公開是什麼錯誤? – scottm

+0

我不認爲這會聞到。我是獨立的每一層的支持者,擁有自己的公共API(除非絕對必要,否則無內部)。所以'Story'類有一個'SubmittedDate'屬性,或者它沒有;如果沒有,那麼UI層就不能使用它;如果是這樣,那麼單元測試也可以使用它。對我來說,只有UI層才能讀取的內部「SubmittedDate」是一種代碼異味 - 它是一種隱藏在「Story」類中的隱藏API,它只存在於您的特定UI層中。那裏的設計依賴性是錯誤的。 –

1

沒有看到您的代碼,似乎您的設計可能需要更改,以使其更易於測試。考慮提取界面並將dependancy injection添加到您的課程中,以便您可以根據需要設置內部狀態。使用這種方法,您可以在施工期間設置私人會員。另外嘗試使用嘲笑庫。 Moq是我的最愛。

2

我認爲改變一個類的公共接口以適應單元測試總是一個壞主意。那是「搖尾巴狗」。

如果你必須訪問的目的是測試它的內部狀態,我會創造在我的測試命名空間中的一些擴展方法,允許方便地訪問對象的私有屬性(例如,T GetPropertyValueByName(此字符串propertyName的)。

+0

Visual Studio可以生成允許訪問內部細節的包裝http://msdn.microsoft.com/en-us/library/bb385974.aspx –

0

您可以進行單元測試庫中的域庫的friend和你的域類的私有成員更改爲內部。