如何在集成测试中手动设置Finbuckle当前租户?
解决.NET Core多租户集成测试中设置租户时的"provider"为空异常
错误原因是手动创建的DefaultHttpContext未绑定ServiceProvider,而TrySetTenantInfo方法内部依赖HttpContext.RequestServices(即ServiceProvider)完成操作,因此抛出参数为空的异常。
解决方法1:为HttpContext绑定ServiceProvider
修改代码,给DefaultHttpContext设置RequestServices属性,绑定测试用的ServiceProvider:
_httpContextAccessor = _servicesProvider.GetRequiredService<IHttpContextAccessor>(); // 创建HttpContext并关联ServiceProvider var httpContext = new DefaultHttpContext { RequestServices = _servicesProvider }; _httpContextAccessor.HttpContext = httpContext; TenantInfo ti = new TenantInfo { Id = "**", Identifier = "**", ConnectionString = "**", Name = "***" }; if (_httpContextAccessor.HttpContext.TrySetTenantInfo(ti, true)) { // 执行后续测试逻辑 }
解决方法2:模拟业务流程用Mediator设置租户
既然实际请求中通过Mediator设置租户,测试时直接复用该逻辑,避免手动操作HttpContext:
var mediator = _servicesProvider.GetRequiredService<IMediator>(); // 假设存在SetTenantCommand用于设置租户,根据实际业务调整命令类型 await mediator.Send(new SetTenantCommand(ti));
这种方式更贴合真实运行流程,减少手动操作HttpContext带来的潜在问题。
解决方法3:替换租户上下文服务(若有封装)
如果应用封装了租户信息获取服务(如ITenantContext),可在测试服务配置中直接替换为测试实现:
// 在测试项目的服务注册环节添加 services.AddScoped<ITenantContext>(sp => new TestTenantContext(ti));
这样仓储和DbContext获取租户信息时会直接使用预设的测试租户,无需操作HttpContext。
内容的提问来源于stack exchange,提问作者Mostafa
相关产品推荐
相关产品推荐

