1

在MVC4 C#網站中,我們使用單元測試來測試我們的代碼。我們目前正在做的是建立一個模擬數據庫,然後測試每一層:Visual Studio 2012中的依賴(程序)單元測試

  1. 測試數據庫 - 連接,初始化,負載等
  2. 測試代碼訪問數據庫
  3. 測試視圖層

我希望這三個類別按順序運行,並且只有在前一個類別通過。這是否正確?我們這樣做的舊方法是使用依賴注入框架,這是模擬測試的一種奇怪的方法。實際上,我們爲每個數據訪問者創建了一個模擬類,這很吸引人,因爲我們必須重新實現每種方法的邏輯,而且它沒有真正增加任何價值,因爲如果我們第一次在邏輯上犯了錯誤,我們會讓它成爲第二個。

回答

3

我希望這三個類別按順序運行,只有在 前一個通過。這是否正確?

不可以。您應該單獨測試所有內容,因爲任何失敗的數據訪問代碼都應該與視圖完全無關。因此,視圖單元測試應該會因完全不同的原因而失敗,因此您應該始終運行所有測試。

一般來說,測試應該單獨運行,不應該依賴於任何其他測試。在我看來,視圖層仍然依賴於數據訪問代碼,但是您只抽象出下面的圖層。在這種情況下,從視角來看,你正在嘲笑一種間接的依賴關係,這使得你的單元測試比嚴格需要的更復雜。

我們這樣做是使用依賴注入 框架是一個奇怪的方法來模擬測試

我不知道,如果我得到這個舊的方式,但它好像你在單元測試中使用DI容器。這是一個絕對的禁忌。不要讓任何DI框架混淆你的測試。而且沒有必要。只需圍繞依賴注入原則設計你的類(將所有依賴作爲構造函數參數公開),並且在你的測試中,你只需用假依賴關係手動新建被測試類即可 - 或者當這導致重複代碼時,在你的測試中創建一個工廠方法類創建被測試類的新實例。

實際上,我們創建了一個模擬類爲每個數據訪問,這吮吸

我不知道,但它聽起來好像有什麼東西不對您的設計在這裏。您通常會有一個IRepository<T>接口,您可能會有多個實現,如UserRepository : IRepository<User>OrderRepository : IRepository<Order>。在你的測試套件中,你將有一個通用的FakeRespository<T>InMemoryRepository<T>,你就完成了。無需在這裏模擬許多課程。

這裏有兩個偉大的著作,你一定要讀:

  1. The Art of Unit Testing
  2. Dependency Injection in .NET

這些圖書會改變你的生活。而且既然你會閱讀,也請閱讀this book(不涉及你的問題,但代碼也是一個改變生活的人)。

+0

你能告訴我更多關於'FakeRepository '嗎?如果必須模擬許多其他類,那麼如何設計該類?它基本上是模擬在哪裏訪問數據庫並返回模擬數據而不是通過數據庫? –

+0

另外,對於DI框架,您會推薦什麼? –

+0

我寫了簡單的注射器,所以我不是寫的人問:-) – Steven