单元测试中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
相关产品推荐
相关产品推荐

