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

单元测试中HttpContextAccessor.Session.SetString设置Etag失效求助

解决单元测试中HttpContextAccessor.Session空引用问题

单元测试环境下,HttpContextAccessor.HttpContext及默认Session对象均为null,直接调用会触发空引用异常,以下是具体解决步骤:

  • 构建并初始化模拟HttpContext与Session
    用DefaultHttpContext创建HttpContext实例,同时注册Session依赖的缓存服务并初始化Session:

    // 注册Session所需服务
    var services = new ServiceCollection();
    services.AddDistributedMemoryCache();
    services.AddSession();
    var serviceProvider = services.BuildServiceProvider();
    
    // 创建HttpContext并关联服务提供者
    var httpContext = new DefaultHttpContext { RequestServices = serviceProvider };
    // 初始化Session
    await httpContext.Session.LoadAsync();
    
    // 配置HttpContextAccessor
    var httpContextAccessor = new HttpContextAccessor();
    httpContextAccessor.HttpContext = httpContext;
    
  • 将模拟实例注入目标服务与控制器
    确保你的UtilityService和控制器使用的是带有有效Session的HttpContextAccessor:

    // 初始化UtilityService
    var utilityService = new UtilityService(httpContextAccessor);
    // 初始化控制器并设置ControllerContext
    var targetController = new YourTargetController(utilityService);
    targetController.ControllerContext = new ControllerContext { HttpContext = httpContext };
    
  • 调用方法并验证Session值
    执行SetTag()后直接从模拟HttpContext的Session中取值验证:

    // 调用SetTag方法
    utilityService.SetTag("test-etag-value");
    // 获取Session中的值
    var retrievedEtag = httpContext.Session.GetString("Etag");
    // 断言验证
    Assert.Equal("test-etag-value", retrievedEtag);
    
  • 避坑提示

    • 必须调用Session.LoadAsync()初始化Session,否则直接操作Session会报错;
    • 控制器的ControllerContext.HttpContext必须手动设置,否则控制器内部逻辑可能访问到null的HttpContext;
    • 不能省略AddDistributedMemoryCache()和AddSession(),这是Session正常工作的依赖基础。

内容的提问来源于stack exchange,提问作者Nagu V

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 16:04:59