Asp.net-Mvc

ASP.Net MVC 中 HttpContext 和可測試控制器的最佳實踐

  • April 2, 2017

更新:

根據我收到的幾個答案,我只想說明我很清楚如何使用模擬框架來模擬 HttpContext。與在 HttpContext 周圍使用包裝類相比,我更感興趣了解模擬 HttpContext 的優缺點。


我正在尋找有關在 ASP.Net MVC 中建構可測試控制器時如何處理 HttpContext 的意見。閱讀後似乎有兩種思想流派 - 要麼建構 HttpContextBase 並使用模擬框架為您的單元測試生成所需的存根/模擬,或者圍繞您打算使用的 HttpContext 區域建構不可知的包裝類.

現在我傾向於建立 HttpContextBase。看起來它既是更快的開發過程,又更容易維護,因為您不必花時間開發和維護額外的包裝類。我可以看到包裝類可能是如何有益的,因為它們抽象了底層實現並將控制器的上下文與請求分開 - 但我不確定這是否值得額外的設置和維護成本。

你覺得這兩種方法的優缺點是什麼?你什麼時候會選擇其中一種?是否有某些類型的開發比另一種更適合其中一種解決方案?

由於這似乎是大多數進行單元測試和使用 ASP.Net MVC 的團隊必須處理的常見問題,您將如何處理這個問題?如果你已經解決了這個問題,你的解決方案是如何工作的,你現在會做些什麼不同的事情?

我傾向於 HttpContextBase。主要是因為我認為它是為了這個原因而發明的:可測試性。既然已經有了可接受的解決方案,為什麼還要重新發明輪子。

如果您在圍繞 HttpContext 的包裝類中投入大量精力,您最終會得到與 HttpContextBase 非常相似的東西……

我使用 Rhino.Mocks 進行測試。為了在控制器中設置 HttpContext,我只是模擬了它。所以我的被測系統(或 sut)是這樣的:

           Controller controllerBase = sut as Controller;

然後我模擬出控制器上下文,並在控制器上下文上設置上下文以返回 HttpContextBase 類的模擬(如上所述)。我的程式碼看起來像:

controllerContext = AMockOf<ControllerContext>();

// Add the test HttpContextBase to the controller context
HttpContextBase httpContextBase = SetUpTestHttpContext();
WhenThe(controllerContext).IsAskedForIts(x =>x.HttpContext).Return(httpContextBase).Repeat.Any();

對於其他對象,我有時也會使用假貨。

引用自:https://stackoverflow.com/questions/1089054