单元测试 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中文网其他相关文章!