簡體   English   中英

沒有DI的單元測試遺留代碼

[英]Unit Testing Legacy Code without DI

我們正在嘗試將單元測試添加到我們的業務層中。 技術堆棧是asp.net Web表單,WCF,ADO.Net調用存儲過程)。 業務層在數據類上調用靜態方法,因此很難在不進行大量更改的情況下引入DI。

它可能不是一種傳統的方法,但我想將DB保留在單元測試(依賴)中,但將其用作測試Db ...使用現有的凍結數據庫或在表中模擬數據。 我想知道使用測試數據庫的可行性,其中存儲過程像Mocks一樣使用。 不要復制整個數據庫,只需創建由存儲過程命名的表名。 存儲過程只調用一個表,並返回靜態數據......本質上,嘗試使用類似Moq但從DB角度模擬Mocking數據的功能。

任何人都可以推薦任何在測試中包含數據庫的設計,這仍然是確定性的嗎?

如果你想在測試中使用數據庫並確保所有內容都是確定性的,那么你需要每個測試都有自己的數據庫,這意味着為每個測試創建(並可能填充)一個新的數據庫。

根據數據庫層創建連接的方式,這是可行的。 我通過在測試設置中使用localDb生成一個DB,並使用名稱的GUID,然后在拆除測試結束時再次刪除DB。

它最終變得相當慢(不足為奇)但是在Ram磁盤驅動器上創建的DB有助於此。

這適用於空dbs,然后有EF創建的模式,但是如果你需要DB中的一組固定數據,那么你可能需要在測試設置中從備份中恢復它

在我看來,在為每個測試調用它們時,設置存儲過程以執行您希望它們執行的操作將會有很多工作,並且您仍然會遇到數據庫始終存在的速度問題。 我建議您改為執行以下一項或兩項操作:

  1. 使用TypeMock ,它具有強大的隔離工具。 它基本上改變了你的編譯,使你的單元測試可以模擬甚至靜態方法。
  2. 而不僅僅是單元測試,嘗試創建“驗收測試”,專注於模仿完整的用戶體驗:登錄,創建對象,查看對象(驗證對象看起來正確),更新對象,再次查看對象(同上),刪除對象(驗證對象已刪除)。 通過設置此特定測試所需的所有對象開始每個測試,並通過刪除所有這些對象結束,以便其他測試可以基於假定的起始狀態運行。

第一種方法為您提供真正的“單元”測試的速度和可模擬性,而第二種方法允許您運行更多的代碼,增加了捕獲錯誤的可能性,即使在存儲過程等方面也是如此。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM