使用 Moq 在 ASP.NET MVC 中模拟 HttpContext:实用指南
当使用 Moq 对 ASP.NET MVC 控制器进行单元测试时,模拟 HttpContext
由于其只读性质而带来了挑战。 尝试直接将模拟的 HttpContext
分配给控制器的 HttpContext
属性会导致错误,如以下示例所示:
<code class="language-csharp">[TestMethod] public void Home_Message_Display_Unknown_User_when_coockie_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(); controller.HttpContext = context.Object; // Error: Read-only property }</code>
解决方案在于操纵ControllerContext
。 这种方法提供了对底层 HttpContext
的访问,而不会违反只读约束。 方法如下:
<code class="language-csharp">controller.ControllerContext = new ControllerContext(context.Object, new RouteData(), controller);</code>
另一种有效的方法是重写基本控制器中的 Initialize
方法。这允许您将模拟的 HttpContext
注入 RequestContext
:
<code class="language-csharp">protected override void Initialize(RequestContext requestContext) { base.Initialize(requestContext); requestContext.HttpContext = context.Object; }</code>
有关使用 Moq 模拟 HttpRequestBase
和 HttpContext
的全面指南,请参阅以下 Microsoft 文档:
以上是如何使用 Moq 在 ASP.NET MVC 中有效模拟 HttpContext?的详细内容。更多信息请关注PHP中文网其他相关文章!