單元測試 ASP.NET MVC 控制器通常需要模擬 HttpContext
將程式碼與 Web 伺服器相依性隔離。 Moq 是一個強大的模擬框架,為模擬 HttpContext
及其屬性提供了強大的解決方案。
挑戰:
使用 Moq 直接嘲笑 HttpContext
會出現一個常見的陷阱:
<code class="language-csharp">[TestMethod] public void Home_Message_Display_Unknown_User_when_cookie_does_not_exist() { var context = new Mock<HttpContextBase>(); var request = new Mock<HttpRequestBase>(); context .Setup(c => c.Request) .Returns(request.Object); HomeController controller = new HomeController(); // Error: HttpContext is read-only. controller.HttpContext = context.Object; ... }</code>
嘗試將模擬的 HttpContext
直接指派給控制器的 HttpContext
屬性會失敗,因為它是唯讀的。
解:
正確的方法是設定 ControllerContext
屬性。 ControllerContext
繼承自 HttpContext
,提供必要的存取點:
<code class="language-csharp">controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);</code>
進一步閱讀:
有關使用 Moq 模擬 HttpContext
和 RequestContext
的更多詳細信息,請參閱以下資源:
以上是如何使用 Moq 在 ASP.NET MVC 單元測試中正確模擬 HttpContext?的詳細內容。更多資訊請關注PHP中文網其他相關文章!