# Akka.Cluster 单元测试报告

# 1. 测试范围

对应文件:test/Air.Cloud.UnitTest/Modules/Akka/AkkaClusterModuleUnitTests.cs。

目标是验证 Air.Cloud.Modules.Akka 的本地契约,不启动真实网络边界,重点覆盖配置默认值、HOCON 构建、Actor 注册表、DI 注册、授权默认实现和未启动生命周期边界。

# 2. 测试内容与边界

# 配置与 HOCON

测试目标 边界内入参 边界外 / 异常入参 预期结果
默认配置 new AkkaSettingsOptions() 未传配置 Enabled=true,默认系统名、监听地址、Ask/Shutdown 超时符合模块约定。
集合初始化 默认 Roles、SeedNodes、Domains 未显式初始化集合 可以直接添加角色、种子节点和业务域。
Domain 大小写 Order、order、ORDER 不同大小写访问 业务域字典大小写不敏感。
Cluster Provider 默认配置构建 HOCON 无自定义 HOCON 输出 actor.provider = cluster。
Host/Port 127.0.0.1:4053 非默认监听地址 HOCON 保留业务传入监听信息。
Roles/SeedNodes 多角色、多种子节点 集合多值 HOCON 输出完整角色和入群地址。
自定义 HOCON akka.loglevel = DEBUG 追加配置 自定义内容追加到默认 HOCON 后。

# 注册表与命名隔离

测试目标 边界内入参 边界外 / 异常入参 预期结果
空描述 descriptor = null 非法输入 抛出 ArgumentNullException。
空 ActorName new AkkaActorDescriptor() 缺少名称 抛出 ArgumentException。
注册与查找 ActorName = worker 正常注册 可以按名称解析 ActorRef。
大小写查找 OrderWorker 与 orderworker 大小写不一致 可以查找到同一 Actor。
同名覆盖 两次注册 worker Domain 不同但名称相同 后注册描述覆盖先注册描述。
前缀隔离 order-worker、inventory-worker 多业务域同名基础 Actor 两个 Actor 都能保留,避免冲突。

# DI 与生命周期

测试目标 边界内入参 边界外 / 异常入参 预期结果
默认注册 空 ServiceCollection 调用 AddAkkaCluster() 未预注册业务实现 注册默认 Registry、ClusterService、AuthorizationHandler 和 HostedService。
配置委托 SystemName、Roles 代码覆盖配置默认值 IOptions<AkkaSettingsOptions> 保留委托配置。
业务自定义 Registry 调用前注册 IAkkaActorRegistry 默认实现可能覆盖业务实现 不覆盖业务实现。
业务自定义 ClusterService 调用前注册 IAkkaClusterService 默认实现可能覆盖业务实现 不覆盖业务实现。
有参创建契约 IAkkaClusterService.ActorOf<TActor>(name, args) 业务实现接收显式构造参数 接口契约保留 ActorName 和参数集合。
禁用启动 Enabled=false 调用 StartAsync 不创建 ActorSystem。
未启动 Stop 直接调用 StopAsync ActorSystem 为空 不抛出异常。
未启动 Tell 直接发送消息 ActorSystem 为空 抛出 InvalidOperationException。

# 3. 测试数量

当前 Akka 单元测试共 30 个。

# 4. 验证命令

dotnet test test/Air.Cloud.UnitTest/Air.Cloud.UnitTest.csproj --filter "FullyQualifiedName~Modules.Akka"

当前工作区运行单元测试时会先执行 Xunit.DependencyInjection 测试宿主启动。若现有 Quartz 程序集接口实现不一致,测试宿主会在 Akka 测试断言前失败;该问题不属于 Akka 单元测试逻辑。