我們剛剛發佈了一個爲我們專有系統重寫的模塊(第三次)。這個模塊,我們稱之爲負載管理器,迄今爲止是迄今爲止我們系統中所有模塊中最複雜的。我們試圖獲得一個全面的測試套件,因爲每當我們對這個模塊做出任何重大改變時,都會花費數週時間來解決錯誤和怪癖。然而,開發一個測試套件已經證明是相當困難的,所以我們正在尋找想法。需要TDD方法的想法
負載管理器的內存駐留在一個名爲LoadManagerHandler的類中,這實質上是模塊背後的所有邏輯。該處理程序調用多個控制器在數據庫中執行CRUD方法。這些控制器實際上是位於頂部的DAL的頂層,並將我們的LLBLGen生成的代碼抽象出來。
所以很容易模擬這些控制器,我們正在使用Moq框架。然而問題出在Load Manager的複雜性上,我們收到的問題並不是處理簡單的案例,而是處理器中包含大量數據的情況。
簡要解釋負載管理器包含一些「卸載」細節,有時數百個,然後放入用戶創建的負載和reship池中。在創建和填充這些負載的過程中,會有大量的刪除,更改和添加,最終導致問題出現。然而,因爲當你嘲笑對象的方法,最後模擬勝,即:
jobDetailControllerMock.Setup(mock => mock.GetById(1)).Returns(jobDetail1);
jobDetailControllerMock.Setup(mock => mock.GetById(2)).Returns(jobDetail2);
jobDetailControllerMock.Setup(mock => mock.GetById(3)).Returns(jobDetail3);
不管我送jobDetailController.GetById(X)我將永遠找回jobDetail3。這使得測試幾乎不可能,因爲我們必須確保在更改所有點都受到影響時應該受到影響。
因此,我決定使用測試數據庫,只是允許正常的讀寫操作。但是,因爲不能(讀取:不應該)指定測試的順序,所以早期運行的測試可能會導致稍後運行的測試失敗。
TL/DR:我本質上是在尋找面向數據的代碼的測試策略,這種代碼本質上是非常複雜的。
我提高了你的答案,因爲我不知道這是可能的,但我不相信這將完全達到我期待的結果。我需要根據所使用的參數返回特定的數據,並且此方法不一定會按預定順序調用。不過非常感謝,這會幫助我在其他地方。 – joshlrogers 2009-12-04 17:23:39
好的....有什麼想法,爲什麼這不適合我呢?我正在使用Moq的最新版本,無論我傳入什麼參數,我都會收到最後的模擬返回結果。 – joshlrogers 2009-12-04 17:30:16
@josh - 不知道。我使用v3.1.416.3進行了測試,該版本是該網站的最新非beta版本。這是標準行爲,這就是爲什麼必要時引入It.IsAny語法來覆蓋它的原因。我建議你用控制器編寫最簡單的測試,看看你能否消除變量。您也可以發表Moq討論 - 他們非常有幫助。 http://groups.google.com/group/moqdisc – TrueWill 2009-12-04 17:36:43