在WebApplicationFactory中替换HealthCheckService以进行集成测试
解决健康检查重复注册问题的方法
问题根源是原有健康检查配置中已存在名为npgsql的检查项,直接重新添加会触发重复注册错误。无需移除HealthCheckService,只需清空已注册的健康检查项后再重新添加即可。
方案一:清空已有检查项后重新注册
在AddHealthChecks的配置委托中直接清空Registrations集合,再添加测试数据库的健康检查:
builder.ConfigureTestServices(services => { services .RemoveAll<DbContextOptions<ApplicationDbContext>>() .AddDbContext<ApplicationDbContext>((sp, options) => { options.UseNpgsql(_connection); }); // 清空已有健康检查项,再添加测试库的检查 services.AddHealthChecks(options => { // 清除所有已注册的健康检查项 options.Registrations.Clear(); // 添加测试数据库的NpgSql健康检查 options.AddNpgSql(_connection.ConnectionString); }); });
方案二:移除所有健康检查相关注册并重建
如果方案一无效,可尝试彻底移除健康检查的相关注册后重新构建:
builder.ConfigureTestServices(services => { services .RemoveAll<DbContextOptions<ApplicationDbContext>>() .AddDbContext<ApplicationDbContext>((sp, options) => { options.UseNpgsql(_connection); }); // 移除所有已注册的健康检查实现 services.RemoveAll<IHealthCheck>(); // 移除残留的健康检查配置项 services.RemoveAll<IOptions<HealthCheckOptions>>(); // 重新注册健康检查 services.AddHealthChecks().AddNpgSql(_connection.ConnectionString); });
为什么RemoveAll<HealthCheckService>()无效?
HealthCheckService是健康检查的执行服务,而具体的检查项是保存在HealthCheckOptions的Registrations集合中,每个检查项还对应一个IHealthCheck实例的注册。仅移除HealthCheckService不会清除已注册的检查项配置,因此仍会出现重复名称错误。
内容的提问来源于stack exchange,提问作者codeimust
相关产品推荐
相关产品推荐

