簡體   English   中英

如何在不使用存儲庫模式的情況下對 ASP.NET MVC Controller 進行單元測試

[英]How to unit test ASP.NET MVC Controller without Using Repository Pattern

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

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

這僅用於演示目的。

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

您的_db字段類型是接口嗎? 它是通過注射提供的嗎? 如果是這樣,您很可能可以對該方法進行單元測試。

如果不刪除 controller 方法中對數據庫的直接依賴,您將無法對這些方法進行單元測試。

這樣做的總體推薦方法是將 IOC 容器(例如Ninject )與 MVC 結合使用,使您可以將所需的數據傳遞給 controller 的構造函數。該“數據對象”不得綁定到數據庫,通常它只是一個 POCO object 或作為接口傳遞。

在您的單元測試中,您可以使用專為您的單元測試構造的內存數據 object 替換這些依賴項,通常使用 mocking 框架(例如 Rhino Mocks 或Moq )“模擬”。

使用這種方法,您不僅可以使您的控制器可以進行單元測試,而且最終會得到非常松散耦合的代碼,這種好處可能會在以后的開發中得到回報。

這就是所謂的testable代碼:) 當您執行單元測試時,您需要確定,測試失敗的唯一原因是在 SUT(被測系統,或 class 正在測試)實現中發生變化。 當然,當依賴 API 發生變化時它可能會被破壞(沒關系,你應該修改 SUT 以使用新的 API),但如果依賴實現發生變化它永遠不會失敗。 這就是為什么使用 mocking 和存根。

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

所以,回到你的情況:

  • 如果你想擁有可測試的 class,你必須注入依賴(db)
  • 依賴應該被嘲笑
  • 您沒有被迫使用存儲庫模式。 如果你可以模擬你的數據庫 class,就模擬它。 或者使用任何其他數據訪問抽象

暫無
暫無

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

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