想象一下使用存儲庫模式和服務層的中等複雜度的asp.net mvc應用程序。現在想象我們有一些具有廣泛依賴性的行爲。以一個人爲的例子:在CustomerController需要顯示符合以下所有條件,其客戶:單元測試複雜對象圖
- 客戶賬單或送貨地址是在美國佛羅里達州
- 客戶是(使用ClubMembershipService)
- 客戶VIP俱樂部至少有一個以前的訂單
- 客戶擁有至少一輛汽車與模型2005年或更新
- 車上有一個已經召回
- 等,只有少數的一部分更多的一對多或第三方API調用
此範圍的每個測試都需要大量的種子/模擬數據。我的下一個測試可能需要一組類似的但明顯不同的數據。假設在控制器級別進行的任何測試都需要注入6個服務,然後將8個存儲庫注入這些服務。
我該如何保持測試的可管理性?如何導航深層對象圖並確保模擬(或具體)存儲庫在每個測試中提供有效的一致數據,而不需要安裝30行安裝代碼?
例如如果這是使用測試數據庫中的純集成測試,我可能需要如下:
- 幾個客戶記錄
- 幾個地址記錄;一些客戶有多個地址記錄;運送地址在佛羅里達州的人;一個帳單地址在佛羅里達州
- 幾個訂單
- 一些「CustomerCar」記錄;其中一輛汽車應該有2005年或更新的車型
- 某些「CarPartRecall」記錄;其中的一些將匹配的CustomerCar記錄
- 等爲補充標準的品牌,型號和年份/邏輯
我明白,這可能是有意義的這些標準附加到客戶對象的屬性,如customer.IsInVipClub。我對複雜的案例更感興趣,因爲它們跨越多個聚合邊界,因此不會轉化爲簡單的屬性。例如customer.Owns2005OrNewerCarWithRecalledParts是我通常不會寫的屬性。
建議使用AutoFixture。它看起來像是一個模擬框架和夾具工廠之間的交叉(如在工廠女孩的軌道)。我認爲它會通過自動提供一些屬性值(如customer.firstName)使初始化代碼變得更加簡潔,但感覺像是一個相對較小的增益。我有興趣聽到任何人使用AutoFixture的經驗。
這個問題可能會從一個具體的例子中受益。對我來說,這聽起來像是一個設計問題,而不是單元測試問題。如果您必須以相同的方法與6個服務和8個存儲庫進行交互,那麼該方法最有可能做得很多。 –
我以爲我提供了一個具體的例子。在這個例子中,數據需要來自許多不同的聚合根。例如CustomerService,AddressService ClubMembershipService,OrderService,CarService等等。也許我不清楚 - 在這個例子中,控制器應該只顯示符合項目符號列表中所有條件的客戶。 – betitall
我覺得我不清楚。我的意思是一個代碼示例。 –