You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

单元测试中如何Mock HttpContext并向控制器传递Cookie验证

单元测试中给控制器Mock HttpContext并添加Request Cookie的正确做法

你当前的测试代码存在核心问题:你给Response.Cookies添加了Cookie,但控制器逻辑里判断的是Request.Cookies,这就导致控制器里HttpContext.Request.Cookies["mycookie"]始终为null,甚至可能引发空引用异常。

正确的实现步骤

  1. 初始化控制器实例及依赖(比如Mock后的identifiersService)
  2. 创建DefaultHttpContext并给Request.Cookies添加目标Cookie
  3. 将配置好的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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.28 16:32:19