单元测试中如何Mock HttpContext并向控制器传递Cookie验证
你当前的测试代码存在核心问题:你给Response.Cookies添加了Cookie,但控制器逻辑里判断的是Request.Cookies,这就导致控制器里HttpContext.Request.Cookies["mycookie"]始终为null,甚至可能引发空引用异常。
正确的实现步骤
- 初始化控制器实例及依赖(比如Mock后的
identifiersService) - 创建
DefaultHttpContext并给Request.Cookies添加目标Cookie - 将配置好的HttpContext绑定到控制器的
ControllerContext
完整测试代码示例
// 初始化控制器(注入Mock的依赖,比如identifiersService) var homeController = new HomeController(Mock.Of<IIdentifiersService>()); // 创建HttpContext并配置Request Cookies var httpContext = new DefaultHttpContext(); // 添加需要的Request Cookie httpContext.Request.Cookies.Append("mycookie", "test-cookie-value", new CookieOptions()); // 绑定到控制器 homeController.ControllerContext = new ControllerContext { HttpContext = httpContext }; // 执行待测试的方法 var result = await homeController.Identify();
进阶:用Moq验证Response的Cookie操作
如果需要验证控制器中HttpContext.Response.Cookies.Delete("mycookie")的执行情况,可以用Moq来Mock HttpContext:
// Mock identifiersService var mockIdentifiersService = new Mock<IIdentifiersService>(); // 模拟IsValidAsync返回false,触发删除Cookie的逻辑 mockIdentifiersService.Setup(s => s.IsValidAsync(It.IsAny<string>())).ReturnsAsync(false); var homeController = new HomeController(mockIdentifiersService.Object); // Mock HttpContext及相关对象 var mockHttpContext = new Mock<HttpContext>(); var mockRequestCookies = new Mock<IRequestCookieCollection>(); // 设置Request中存在mycookie mockRequestCookies.Setup(c => c["mycookie"]).Returns("test-value"); mockHttpContext.Setup(ctx => ctx.Request.Cookies).Returns(mockRequestCookies.Object); // Mock Response.Cookies用于验证删除操作 var mockResponseCookies = new Mock<IResponseCookies>(); mockHttpContext.Setup(ctx => ctx.Response.Cookies).Returns(mockResponseCookies.Object); // 绑定到控制器 homeController.ControllerContext = new ControllerContext { HttpContext = mockHttpContext.Object }; // 执行方法,预期抛出MyException await Assert.ThrowsAsync<MyException>(() => homeController.Identify()); // 验证是否执行了Delete操作 mockResponseCookies.Verify(c => c.Delete("mycookie"), Times.Once);
内容的提问来源于stack exchange,提问作者Mukesh
相关产品推荐
相关产品推荐

