2012-04-10 50 views
7

我只是想知道是否有一種方法可以在不使用存儲庫模式的情況下單元測試我的一些控制器Action中的 MVC。我開發了一個ASP.NET MVC網站,但是在初始階段沒有進行單元測試。現在我想演示一些單元測試給我的導師使用可能是兩個或更多的操作在我的控制器。我的大部分行爲邏輯從數據庫獲取數據,一個控制器從不同的表中獲取數據,即一個控制器中的動作從不同的表中讀取。我認爲這可以使用Generic Repository模式進行測試。作爲初學者,我發現我只能單元測試一個不是來自數據庫的代碼,但不幸的是,我的控制器中的大部分代碼Actions都來自數據庫。我在Visual Studio中使用默認的測試工具,並在我的數據庫中使用EF代碼優先方法。
例如,我想單元測試下面的動作,而不必單元測試同一控制器中的其他動作。如何在不使用存儲庫模式的情況下單元測試ASP.NET MVC控制器

public ActionResult Index() 
    { 
     var model = _db.PhotoGallery; 
     return View(model); 
    } 

這只是爲了演示目的。

回答

6

根據定義,單元測試只應該影響它調用的方法。如果您可以找到一種方法來模擬您的_db對象,以便實際上不會導致數據庫往返,那麼您可以對依賴它的此方法進行單元測試。否則,不。

您的_db字段的類型是一個接口嗎?它是通過注射提供的嗎?如果是這樣,那麼你可以單元測試這種方法。

5

如果不在您的控制器方法中刪除對數據庫的直接依賴關係,您將無法單元測試這些方法。

這樣做的總體推薦方式是將IOC容器(例如Ninject)與MVC結合使用,它允許您將需要的數據傳遞給控制器​​的構造函數。這個「數據對象」不能綁定到數據庫,通常它不是隻是一個POCO對象,就是作爲一個接口傳遞。

在您的單元測試中,您可以使用爲單元測試構建的內存數據對象替換這些依賴項,通常使用模擬框架(例如Rhino Mocks或Moq)「模擬」。

使用這種方法,您不僅可以讓您的控制器進行單元測試,而且最終還會得到非常鬆散的代碼,這可能會爲以後的開發帶來好處。

2

這就是所謂的testable代碼:) 當您執行單元測試時,您需要確保在SUT​​(被測系統或正在測試的類)實現中只有失敗測試的原因發生變化。當然,當依賴性API改變時它可能會被破壞(那好,你應該修改SUT來使用新的API),但是如果依賴性實現改變它永遠不會失敗。這就是爲什麼使用嘲笑和存根。

但是,如果你想模擬依賴,你不應該在SUT中創建它。它應該注入SUT(構造函數,參數注入的屬性)。

所以,回到你的情況:

  • 如果你想有可測試的類,你必須注入依賴(DB)
  • 依賴應該被嘲笑
  • 你並不一定要使用存儲庫模式。如果你可以模擬你的db類,只是嘲笑它。或者使用任何其他數據訪問抽象
相關問題