.All 聚合包必须证明每个配置的 Provider 都能被枚举和按 ID 解析。这是 ADR-0005 的硬性要求。
测试位置
tests/Bitzsoft.Integrations.ProviderRouting.Tests/ 是集成测试中心。ProviderRoutingAllRegistrationTests 覆盖几乎所有域的 .All 包。
测试模式
public class ProviderRoutingAllRegistrationTests{ private static IServiceCollection BuildServices( Action<IConfigurationBuilder>? config = null) { var builder = new ConfigurationBuilder(); config?.Invoke(builder); var configuration = builder.Build();
var services = new ServiceCollection(); services.AddSingleton<IConfiguration>(configuration); return services; }
private static IServiceProvider BuildProvider(IServiceCollection services) { // ① 验证作用域和构建——暴露 Captive Dependency 问题 return services.BuildServiceProvider( new ServiceProviderOptions { ValidateScopes = true, ValidateOnBuild = true, }); }
[Fact] public void Payment_All_Registers_All_Configured_Providers() { var services = BuildServices(builder => { builder.AddInMemoryCollection(new Dictionary<string, string?> { ["Payment:Alipay:AppId"] = "test-app", ["Payment:Alipay:AppPrivateKey"] = "test-key", ["Payment:WeChatPay:AppId"] = "test-wx", ["Payment:WeChatPay:MchId"] = "test-mch", }); });
services.AddBitzsoftPaymentAll(services.BuildServiceProvider() .GetRequiredService<IConfiguration>());
var sp = BuildProvider(services);
// ② 验证 Resolver 能枚举和按 ID 解析 var resolver = sp.GetRequiredService<IIntegrationProviderResolver<IPaymentProvider>>();
Assert.True(resolver.TryResolve("Alipay", out var alipay)); Assert.Equal("Alipay", alipay!.Code);
Assert.True(resolver.TryResolve("WeChatPay", out var wechat)); Assert.Equal("WeChatPay", wechat!.Code);
// ③ 未配置的厂商不应出现 Assert.False(resolver.TryResolve("Stripe", out _)); }
[Fact] public void Payment_All_Registers_In_Catalog() { // ... 注册 ...
var catalog = sp.GetRequiredService<IIntegrationProviderCatalog>();
// ① Catalog 应包含已配置 Provider 的 Descriptor Assert.True(catalog.TryGet("Payment:Alipay", out var alipayDesc)); Assert.Equal("Payment", alipayDesc!.Domain); Assert.True(alipayDesc.Supports<IPaymentProvider>());
Assert.True(catalog.TryGet("Payment:WeChatPay", out _)); }
[Fact] public void Payment_All_Provider_Ids_Are_Case_Insensitive() { // ... 注册 ...
var resolver = sp.GetRequiredService<IIntegrationProviderResolver<IPaymentProvider>>();
// ① Provider ID 大小写不敏感 Assert.True(resolver.TryResolve("alipay", out _)); Assert.True(resolver.TryResolve("ALIPAY", out _)); }}辅助方法
// 通用的断言辅助方法private static void AssertProviders<T>( IServiceProvider sp, params string[] expectedIds) where T : class{ var resolver = sp.GetRequiredService<IIntegrationProviderResolver<T>>(); foreach (var id in expectedIds) Assert.True(resolver.TryResolve(id, out _), $"Provider '{id}' was not registered");}
private static void AssertCatalog( IServiceProvider sp, string domain, params string[] expectedIds){ var catalog = sp.GetRequiredService<IIntegrationProviderCatalog>(); foreach (var id in expectedIds) Assert.True(catalog.TryGet($"{domain}:{id}", out _), $"Descriptor for '{domain}:{id}' not found in catalog");}覆盖范围
ProviderRoutingAllRegistrationTests 覆盖以下域的 .All 包:
| 域 | 聚合方法 |
|---|---|
| Payment | AddBitzsoftPaymentAll |
| FileStorage | AddBitzsoftFileStorageAll |
| TeamWork | AddBitzsoftTeamWorkAll |
| ElectronicSignature | AddBitzsoftElectronicSignatureAll |
| Express | AddBitzsoftExpressAll |
| CloudDrive | AddBitzsoftCloudDriveAll |
| EnterpriseMail | AddBitzsoftEnterpriseMailAll |
| LegalDatabase | AddBitzsoftLegalDatabaseAll |
| OutboundCall | AddBitzsoftOutboundCallAll |
| EnterpriseInfo | AddBitzsoftEnterpriseInfoAll |
| Finance | AddBitzsoftFinanceAll |