Skip to content
Bitzsoft.Integrationsbitzsoft.integrations

Guide

Provider 路由测试

.All 聚合包的注册枚举验证和按 ID 解析测试。

Last updated

.All 聚合包必须证明每个配置的 Provider 都能被枚举和按 ID 解析。这是 ADR-0005 的硬性要求。

测试位置

tests/Bitzsoft.Integrations.ProviderRouting.Tests/ 是集成测试中心。ProviderRoutingAllRegistrationTests 覆盖几乎所有域的 .All 包。

测试模式

tests/Bitzsoft.Integrations.ProviderRouting.Tests/ProviderRoutingAllRegistrationTests.cs
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 包:

聚合方法
PaymentAddBitzsoftPaymentAll
FileStorageAddBitzsoftFileStorageAll
TeamWorkAddBitzsoftTeamWorkAll
ElectronicSignatureAddBitzsoftElectronicSignatureAll
ExpressAddBitzsoftExpressAll
CloudDriveAddBitzsoftCloudDriveAll
EnterpriseMailAddBitzsoftEnterpriseMailAll
LegalDatabaseAddBitzsoftLegalDatabaseAll
OutboundCallAddBitzsoftOutboundCallAll
EnterpriseInfoAddBitzsoftEnterpriseInfoAll
FinanceAddBitzsoftFinanceAll

相关

100%

滚轮或按钮缩放 · 放大后拖动画面 · 双击切换 100% / 200%