3

想象一下使用存儲庫模式和服務層的中等複雜度的asp.net mvc應用程序。現在想象我們有一些具有廣泛依賴性的行爲。以一個人爲的例子:在CustomerController需要顯示符合以下所有條件,其客戶:單元測試複雜對象圖

  • 客戶賬單或送貨地址是在美國佛羅里達州
  • 客戶是(使用ClubMembershipService)
  • 客戶VIP俱樂部至少有一個以前的訂單
  • 客戶擁有至少一輛汽車與模型2005年或更新
  • 車上有一個已經召回
  • 等,只有少數的一部分更多的一對多或第三方API調用

此範圍的每個測試都需要大量的種子/模擬數據。我的下一個測試可能需要一組類似的但明顯不同的數據。假設在控制器級別進行的任何測試都需要注入6個服務,然後將8個存儲庫注入這些服務。

我該如何保持測試的可管理性?如何導航深層對象圖並確保模擬(或具體)存儲庫在每個測試中提供有效的一致數據,而不需要安裝30行安裝代碼?

例如如果這是使用測試數據庫中的純集成測試,我可能需要如下:

  • 幾個客戶記錄
  • 幾個地址記錄;一些客戶有多個地址記錄;運送地址在佛羅里達州的人;一個帳單地址在佛羅里達州
  • 幾個訂單
  • 一些「CustomerCar」記錄;其中一輛汽車應該有2005年或更新的車型
  • 某些「CarPartRecall」記錄;其中的一些將匹配的CustomerCar記錄
  • 等爲補充標準的品牌,型號和年份/邏輯

我明白,這可能是有意義的這些標準附加到客戶對象的屬性,如customer.IsInVipClub。我對複雜的案例更感興趣,因爲它們跨越多個聚合邊界,因此不會轉化爲簡單的屬性。例如customer.Owns2005OrNewerCarWithRecalledParts是我通常不會寫的屬性。

建議使用AutoFixture。它看起來像是一個模擬框架和夾具工廠之間的交叉(如在工廠女孩的軌道)。我認爲它會通過自動提供一些屬性值(如customer.firstName)使初始化代碼變得更加簡潔,但感覺像是一個相對較小的增益。我有興趣聽到任何人使用AutoFixture的經驗。

+0

這個問題可能會從一個具體的例子中受益。對我來說,這聽起來像是一個設計問題,而不是單元測試問題。如果您必須以相同的方法與6個服務和8個存儲庫進行交互,那麼該方法最有可能做得很多。 –

+0

我以爲我提供了一個具體的例子。在這個例子中,數據需要來自許多不同的聚合根。例如CustomerService,AddressService ClubMembershipService,OrderService,CarService等等。也許我不清楚 - 在這個例子中,控制器應該只顯示符合項目符號列表中所有條件的客戶。 – betitall

+0

我覺得我不清楚。我的意思是一個代碼示例。 –

回答

1

您的問題看起來像一個簡單的查詢,測試它沒有任何價值。並非所有事情都需要進行聯合測試。

如果你真的想測試這個,你可以做一個集成測試。建立一個測試數據庫,最好在內存中,插入你的虛擬數據,運行你的查詢斷言結果並刪除虛擬數據。重複每個測試。

對於第三方API調用,除了嘲笑它們之外別無它法。

這仍然是很多工作,但一些測試很難做,需要更多的工作來建立。

請記住,單元測試需要快速運行。如果他們開始花費更長的時間跑,他們會少跑。另一方面,集成測試可能會不時發生,可能需要更多時間。

+0

我不明白這是一個「簡單」的查詢。我可以想象這麼多種不同的代碼失敗的方式。如果我們不測試它,我們怎麼知道它的工作原理? – betitall

+0

請不要將_simple_視爲簡單或不重要,但最終它只是一個查詢,單元測試純數據檢索方法是沒有辦法也沒有價值的。如果這是您業務的核心,那麼通過一切手段進行測試,但是測試重要部分:數據檢索。設置測試數據庫,用數據填充並運行查詢。 –

+0

我明白你的意思是「簡單」,但我覺得我的應用程序邏輯的95%是「只是一個查詢」,按照這個定義。我開始認爲集成測試對於我工作的以數據爲中心的LOB應用程序來說更好。他們仍然需要很多設置。 – betitall