我試圖通過將TDD應用到我的一個簡單項目來學習TDD。一些細節(和前面一個問題)在這裏:TDD:存根,模擬或以上都不是
TDD: Help with writing Testable Class
的細節是我有了個PurchaseOrder(在構造函數傳遞)的私有列表中PurchaseOrderCollection類,而個PurchaseOrders有一個布爾屬性的IsValid 。 PurchaseOrderCollection有一個屬性HasErrors,如果列表中的任何PurchaseOrders的IsValid爲false,則返回true。這是我想測試的邏輯。
[TestMethod]
public void Purchase_Order_Collection_Has_Errors_Is_True_If_Any_Purchase_Order_Has_Is_Valid_False()
{
List<PurchaseOrder> orders = new List<PurchaseOrder>();
orders.Add(new PurchaseOrder(--some values to generate IsValid false--));
orders.Add(new PurchaseOrder(--some values to generate IsValid true--));
PurchaseOrderCollection collection = new PurchaseOrderCollection(orders);
Assert.IsTrue(collection.HasErrors);
}
這與我以前在這個測試太耦合這個問題,我必須要知道的是什麼使了一個採購訂單的isValid或真或假,以通過測試的邏輯,如果真是這個測試不應該關心。問題不同(imo),因爲類本身不是問題。
本質上,我想能夠聲明一個具有IsValid假或真的PurchaseOrder,而不知道什麼是PurchaseOrder。
從我有限的TDD知識,這是你使用存根或模擬的東西。我的主要問題是,這是正確的?或者我應該使用不同的方法呢?還是我完全有缺陷,我只是寫這個測試,並認爲它錯了?
我最初的想法是隻使用某種模擬框架,並創建一個始終返回true或false的PurchaseOrder。從我讀過的內容來看,我需要聲明IsValid是虛擬的。所以我的第二個想法是將其改爲添加IPurchaseOrder作爲PurchaseOrder的接口,並創建一個總是返回false或true的假PurchaseOrder。這兩個有效的想法?
謝謝!
我也喜歡你的答案,但只能挑選一個〜 在這種情況下,構成有效採購訂單的邏輯增長超出了能夠通過單個採購訂單計算的邏輯。我還沒有編寫代碼,但將邏輯推出到PurchaseOrderValidityChecker似乎很可能。 – anonymous 2009-01-27 16:57:49
我最初的這種猶豫是試圖在大型的無法測試的班級和班級爆發之間找到一個平衡點,在這個班級裏,我將每種方法都引入到自己的班級中。我想經驗在這裏會有所幫助。感謝您的回答。 – anonymous 2009-01-27 17:01:12