使用 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中文網其他相關文章!