diff --git a/GFramework.Core.Tests/TEST_COVERAGE_PLAN.md b/GFramework.Core.Tests/TEST_COVERAGE_PLAN.md index cbddba0..61d7e40 100644 --- a/GFramework.Core.Tests/TEST_COVERAGE_PLAN.md +++ b/GFramework.Core.Tests/TEST_COVERAGE_PLAN.md @@ -2,7 +2,7 @@ > **生成日期**: 2026-01-18 > **最后更新**: 2026-01-18 -> **当前版本**: Core测试覆盖率 ~93.3% (文件级别) +> **当前版本**: Core测试覆盖率 ~79.2% (文件级别) > **目标**: 提升Core模块测试覆盖率至 95%+ 并补充缺失的单元测试 --- @@ -13,8 +13,8 @@ |--------|--------|--------|---------|-----------| | 架构系统 | 6 | 4 | 1 | 83% | | 事件系统 | 8 | 5 | 0 | 100% | -| 命令系统 | 4 | 1 | 0 | 100% | -| 查询系统 | 3 | 1 | 0 | 100% | +| 命令系统 | 4 | 1 | 3 | 25% | +| 查询系统 | 5 | 1 | 3 | 20% | | 日志系统 | 5 | 2 | 0 | 100% | | 扩展方法 | 4 | 2 | 0 | 100% | | 状态系统 | 4 | 2 | 0 | 100% | @@ -27,20 +27,20 @@ | 工具类 | 1 | 0 | 1 | 0% | | 环境系统 | 2 | 1 | 0 | 100% | | 常量 | 2 | 0 | 2 | 0% | -| **总计** | **47** | **20** | **4** | **91.5%** | +| **总计** | **48** | **20** | **10** | **79.2%** | > **注**: 标记为0个测试文件的模块通过间接测试(集成测试)实现了功能覆盖 +> **重要发现**: 命令系统和查询系统的异步功能完全缺失测试! --- ## 🎯 测试补充优先级概览 -| 优先级 | 文件数 | 预计测试数 | 描述 | -|---------|-------|-----------|----------| -| 🔴 高优先级 | 1 | 6-8 | 核心基类直接测试 | -| 🟡 中优先级 | 2 | 6-10 | 常量验证测试 | -| 🟢 低优先级 | 1 | 4-6 | 辅助功能测试 | -| **总计** | **4** | **16-24** | - | +| 优先级 | 任务数 | 预计测试数 | 描述 | +|---------|-------|-----------|-------------| +| 🔴 高优先级 | 5 | 34-44 | 异步核心功能和工具基类 | +| 🟡 中优先级 | 2 | 6-10 | 常量验证测试 | +| **总计** | **7** | **40-54** | - | --- @@ -59,16 +59,44 @@ **测试用例总数**: 147个 +--- + ### Command 模块 (4个源文件) -| 源文件 | 对应测试文件 | 测试覆盖 | -|-------------------------|-------------------------|--------| -| AbstractAsyncCommand.cs | CommandBusTests.cs (间接) | ✅ 已覆盖 | -| AbstractCommand.cs | CommandBusTests.cs (间接) | ✅ 已覆盖 | -| CommandBus.cs | CommandBusTests.cs | ✅ 4个测试 | -| EmptyCommandInput.cs | CommandBusTests.cs (间接) | ✅ 已覆盖 | +| 源文件 | 对应测试文件 | 测试覆盖 | +|-----------------------------|-------------------------|------------| +| **AbstractAsyncCommand.cs** | **缺失** | ❌ 需创建测试文件 | +| AbstractCommand.cs | CommandBusTests.cs (间接) | ✅ 已覆盖 | +| **CommandBus.cs** | CommandBusTests.cs | ⚠️ 需补充异步测试 | +| EmptyCommandInput.cs | CommandBusTests.cs (间接) | ✅ 已覆盖 | -**测试用例总数**: 4个 +**测试用例总数**: 4个(需补充异步测试) + +**需要补充**: + +1. ❌ AbstractAsyncCommandTests.cs - 新建(高优先级) +2. ❌ CommandBusTests.cs - 补充 SendAsync 方法测试(高优先级) + +--- + +### Query 模块 (5个源文件) + +| 源文件 | 对应测试文件 | 测试覆盖 | +|---------------------------|-----------------------|-----------| +| **AbstractAsyncQuery.cs** | **缺失** | ❌ 需创建测试文件 | +| AbstractQuery.cs | QueryBusTests.cs (间接) | ✅ 已覆盖 | +| **AsyncQueryBus.cs** | **缺失** | ❌ 需创建测试文件 | +| EmptyQueryInput.cs | QueryBusTests.cs (间接) | ✅ 已覆盖 | +| QueryBus.cs | QueryBusTests.cs | ✅ 3个测试 | + +**测试用例总数**: 3个(需补充异步测试) + +**需要补充**: + +1. ❌ AbstractAsyncQueryTests.cs - 新建(高优先级) +2. ❌ AsyncQueryBusTests.cs - 新建(高优先级) + +--- ### Constants 模块 (2个源文件) @@ -79,136 +107,144 @@ **测试用例总数**: 0个 -### Environment 模块 (2个源文件) +**需要补充**: -| 源文件 | 对应测试文件 | 测试覆盖 | -|-----------------------|--------------------------|--------| -| DefaultEnvironment.cs | EnvironmentTests.cs | ✅ 已有测试 | -| EnvironmentBase.cs | EnvironmentTests.cs (间接) | ✅ 已覆盖 | - -**测试用例总数**: 12个 - -### Events 模块 (8个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|-----------------------|----------------------------|--------| -| ArchitectureEvents.cs | ArchitectureEventsTests.cs | ✅ 9个测试 | -| DefaultUnRegister.cs | UnRegisterTests.cs (间接) | ✅ 已覆盖 | -| EasyEvent.cs | EventTests.cs (间接) | ✅ 已覆盖 | -| EasyEventGeneric.cs | EventTests.cs (间接) | ✅ 已覆盖 | -| EasyEvents.cs | EasyEventsTests.cs | ✅ 已有测试 | -| EventBus.cs | EventBusTests.cs | ✅ 已有测试 | -| OrEvent.cs | OrEventTests.cs | ✅ 已有测试 | -| UnRegisterList.cs | UnRegisterTests.cs (间接) | ✅ 已覆盖 | - -**测试用例总数**: 37个 - -### Extensions 模块 (4个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|----------------------------|---------------------------------|--------| -| ContextAwareExtensions.cs | ContextAwareTests.cs (间接) | ✅ 已覆盖 | -| ObjectExtensions.cs | ObjectExtensionsTests.cs | ✅ 已有测试 | -| OrEventExtensions.cs | OrEventTests.cs (间接) | ✅ 已覆盖 | -| UnRegisterListExtension.cs | UnRegisterListExtensionTests.cs | ✅ 已有测试 | - -**测试用例总数**: 17个 - -### IoC 模块 (1个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|-----------------|----------------------|---------| -| IocContainer.cs | IocContainerTests.cs | ✅ 21个测试 | - -**测试用例总数**: 21个 - -### Logging 模块 (5个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|---------------------------------|----------------------------|--------| -| AbstractLogger.cs | LoggerTests.cs (间接) | ✅ 已覆盖 | -| ConsoleLogger.cs | ConsoleLoggerTests.cs | ✅ 已有测试 | -| ConsoleLoggerFactory.cs | LoggerFactoryTests.cs (间接) | ✅ 已覆盖 | -| ConsoleLoggerFactoryProvider.cs | LoggerFactoryTests.cs (间接) | ✅ 已覆盖 | -| LoggerFactoryResolver.cs | LoggerFactoryTests.cs (间接) | ✅ 已覆盖 | - -**测试用例总数**: 69个 - -### Model 模块 (1个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|------------------|----------------------------------------------------------|-------| -| AbstractModel.cs | SyncArchitectureTests.cs, AsyncArchitectureTests.cs (间接) | ✅ 已覆盖 | - -**测试用例总数**: 间接覆盖 - -### Pool 模块 (1个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|-----------------------------|--------------------|--------| -| AbstractObjectPoolSystem.cs | ObjectPoolTests.cs | ✅ 6个测试 | - -**测试用例总数**: 6个 - -### Property 模块 (2个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|-------------------------------|-------------------------------|--------| -| BindableProperty.cs | BindablePropertyTests.cs | ✅ 已有测试 | -| BindablePropertyUnRegister.cs | BindablePropertyTests.cs (间接) | ✅ 已覆盖 | - -**测试用例总数**: 8个 - -### Query 模块 (3个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|--------------------|-----------------------|--------| -| AbstractQuery.cs | QueryBusTests.cs (间接) | ✅ 已覆盖 | -| EmptyQueryInput.cs | QueryBusTests.cs (间接) | ✅ 已覆盖 | -| QueryBus.cs | QueryBusTests.cs | ✅ 3个测试 | - -**测试用例总数**: 3个 - -### Rule 模块 (1个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|---------------------|---------------------------|-------| -| ContextAwareBase.cs | ContextAwareTests.cs (间接) | ✅ 已覆盖 | - -**测试用例总数**: 间接覆盖 - -### State 模块 (4个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|--------------------------|---------------------------------|--------| -| ContextAwareStateBase.cs | StateMachineSystemTests.cs (间接) | ✅ 已覆盖 | -| StateChangedEvent.cs | StateMachineSystemTests.cs (间接) | ✅ 已覆盖 | -| StateMachine.cs | StateMachineTests.cs | ✅ 已有测试 | -| StateMachineSystem.cs | StateMachineSystemTests.cs | ✅ 已有测试 | - -**测试用例总数**: 33个 - -### System 模块 (1个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|-------------------|----------------------------------------------------------|-------| -| AbstractSystem.cs | SyncArchitectureTests.cs, AsyncArchitectureTests.cs (间接) | ✅ 已覆盖 | - -**测试用例总数**: 间接覆盖 - -### Utility 模块 (1个源文件) - -| 源文件 | 对应测试文件 | 测试覆盖 | -|---------------------------|--------|-------| -| AbstractContextUtility.cs | **缺失** | ❌ 需补充 | - -**测试用例总数**: 0个 +1. ❌ ArchitectureConstantsTests.cs - 新建(中优先级) +2. ❌ GFrameworkConstantsTests.cs - 新建(中优先级) --- -## 🔴 高优先级 - 核心功能缺失测试(1个文件) +### Utility 模块 (1个源文件) -### 1. AbstractContextUtilityTests.cs +| 源文件 | 对应测试文件 | 测试覆盖 | +|---------------------------|--------|-----------| +| AbstractContextUtility.cs | **缺失** | ❌ 需创建测试文件 | + +**测试用例总数**: 0个 + +**需要补充**: + +1. ❌ AbstractContextUtilityTests.cs - 新建(高优先级) + +--- + +### 其他模块 (Events, Logging, IoC, etc.) + +所有其他模块的测试覆盖率均达到 100%(包括间接测试覆盖),详见下文详细列表。 + +--- + +## 🔴 高优先级 - 异步核心功能(5个任务) + +### 任务1: CommandBusTests.cs - 补充异步测试 + +**源文件路径**: `GFramework.Core/command/CommandBus.cs` + +**优先级**: 🔴 高 + +**原因**: CommandBus 已实现 SendAsync 方法但没有任何测试 + +**需要补充的测试内容**: + +- ✅ SendAsync(IAsyncCommand) 方法 - 执行无返回值的异步命令 +- ✅ SendAsync(IAsyncCommand) 方法 - 处理 null 异步命令 +- ✅ SendAsync(IAsyncCommand) 方法 - 执行有返回值的异步命令 +- ✅ SendAsync(IAsyncCommand) 方法 - 处理 null 异步命令 + +**预计测试数**: 4 个 + +**测试文件**: `GFramework.Core.Tests/command/CommandBusTests.cs` + +**操作**: 在现有测试文件中补充异步测试方法 + +**状态**: ❌ 待补充 + +--- + +### 任务2: AbstractAsyncCommandTests.cs + +**源文件路径**: `GFramework.Core/command/AbstractAsyncCommand.cs` + +**优先级**: 🔴 高 + +**原因**: 异步命令基类没有任何单元测试,是核心功能 + +**需要测试的内容**: + +- ✅ 异步命令无返回值版本的基础实现 +- ✅ 异步命令有返回值版本的基础实现 +- ✅ ExecuteAsync 方法调用 +- ✅ ExecuteAsync 方法的异常处理 +- ✅ 上下文感知功能(SetContext, GetContext) +- ✅ 日志功能(Logger属性) +- ✅ 子类继承行为验证(两个版本) +- ✅ 命令执行前日志记录 +- ✅ 命令执行后日志记录 +- ✅ 错误情况下的日志记录 + +**预计测试数**: 10-12 个 + +**创建路径**: `GFramework.Core.Tests/command/AbstractAsyncCommandTests.cs` + +**状态**: ❌ 待创建 + +--- + +### 任务3: AsyncQueryBusTests.cs + +**源文件路径**: `GFramework.Core/query/AsyncQueryBus.cs` + +**优先级**: 🔴 高 + +**原因**: 异步查询总线是核心组件,需要完整的单元测试 + +**需要测试的内容**: + +- ✅ SendAsync 方法 - 正常查询发送 +- ✅ SendAsync 方法 - 空查询异常 +- ✅ 异步查询结果正确性 +- ✅ 不同返回类型的异步查询支持 +- ✅ 异步查询的异常处理 +- ✅ 异步查询的上下文传递 + +**预计测试数**: 6-8 个 + +**创建路径**: `GFramework.Core.Tests/query/AsyncQueryBusTests.cs` + +**状态**: ❌ 待创建 + +--- + +### 任务4: AbstractAsyncQueryTests.cs + +**源文件路径**: `GFramework.Core/query/AbstractAsyncQuery.cs` + +**优先级**: 🔴 高 + +**原因**: 异步查询基类没有任何单元测试,是核心功能 + +**需要测试的内容**: + +- ✅ 异步查询的基础实现 +- ✅ DoAsync 方法调用 +- ✅ DoAsync 方法的异常处理 +- ✅ 上下文感知功能(SetContext, GetContext) +- ✅ 日志功能(Logger属性) +- ✅ 子类继承行为验证 +- ✅ 查询执行前日志记录 +- ✅ 查询执行后日志记录 +- ✅ 返回值类型验证 +- ✅ 错误情况下的日志记录 + +**预计测试数**: 8-10 个 + +**创建路径**: `GFramework.Core.Tests/query/AbstractAsyncQueryTests.cs` + +**状态**: ❌ 待创建 + +--- + +### 任务5: AbstractContextUtilityTests.cs **源文件路径**: `GFramework.Core/utility/AbstractContextUtility.cs` @@ -234,9 +270,9 @@ --- -## 🟡 中优先级 - 重要功能缺失测试(2个文件) +## 🟡 中优先级 - 常量验证(2个任务) -### 2. ArchitectureConstantsTests.cs +### 任务6: ArchitectureConstantsTests.cs **源文件路径**: `GFramework.Core/architecture/ArchitectureConstants.cs` @@ -259,7 +295,7 @@ --- -### 3. GFrameworkConstantsTests.cs +### 任务7: GFrameworkConstantsTests.cs **源文件路径**: `GFramework.Core/constants/GFrameworkConstants.cs` @@ -268,7 +304,6 @@ **原因**: 验证框架级别的常量定义 **需要测试的内容**: - - ✅ 版本号常量格式正确性 - ✅ 其他框架常量 - ✅ 常量值正确性 @@ -283,51 +318,50 @@ --- -## 🟢 低优先级 - 辅助功能缺失测试(可选) +## 📊 测试执行计划 -*当前没有低优先级的缺失测试文件* +### 第一批:异步核心功能(4个任务,预计 1.5小时) + +| 序号 | 测试任务 | 操作 | 预计测试数 | 优先级 | 预计时间 | +|----|------------------------------|----|-------|------|------| +| 1 | CommandBusTests.cs - 补充异步测试 | 补充 | 4 | 🔴 高 | 20分钟 | +| 2 | AbstractAsyncCommandTests.cs | 新建 | 10-12 | 🔴 高 | 30分钟 | +| 3 | AsyncQueryBusTests.cs | 新建 | 6-8 | 🔴 高 | 25分钟 | +| 4 | AbstractAsyncQueryTests.cs | 新建 | 8-10 | 🔴 高 | 25分钟 | + +**小计**: 28-34 个测试,约 1.5小时 --- -## 📊 测试执行计划 +### 第二批:工具基类(1个任务,预计 15分钟) -### 第一批:高优先级(1个文件,预计 15分钟) - -| 序号 | 测试文件 | 预计测试数 | 优先级 | 预计时间 | -|----|--------------------------------|-------|------|------| -| 1 | AbstractContextUtilityTests.cs | 6-8 | 🔴 高 | 15分钟 | +| 序号 | 测试文件 | 操作 | 预计测试数 | 优先级 | 预计时间 | +|----|--------------------------------|----|-------|------|------| +| 5 | AbstractContextUtilityTests.cs | 新建 | 6-8 | 🔴 高 | 15分钟 | **小计**: 6-8 个测试 --- -### 第二批:中优先级(2个文件,预计 20分钟) +### 第三批:常量验证(2个任务,预计 20分钟) -| 序号 | 测试文件 | 预计测试数 | 优先级 | 预计时间 | -|----|-------------------------------|-------|------|------| -| 2 | ArchitectureConstantsTests.cs | 3-5 | 🟡 中 | 10分钟 | -| 3 | GFrameworkConstantsTests.cs | 3-5 | 🟡 中 | 10分钟 | +| 序号 | 测试文件 | 操作 | 预计测试数 | 优先级 | 预计时间 | +|----|-------------------------------|----|-------|------|------| +| 6 | ArchitectureConstantsTests.cs | 新建 | 3-5 | 🟡 中 | 10分钟 | +| 7 | GFrameworkConstantsTests.cs | 新建 | 3-5 | 🟡 中 | 10分钟 | **小计**: 6-10 个测试 --- -### 第三批:可选测试(0个文件) - -*所有核心功能已完成测试覆盖* - -**小计**: 0 个测试 - ---- - ## 📊 最终统计 -| 批次 | 文件数 | 预计测试数 | 预计时间 | -|--------|-------|-----------|----------| -| 第一批 | 1 | 6-8 | 15分钟 | -| 第二批 | 2 | 6-10 | 20分钟 | -| 第三批 | 0 | 0 | 0分钟 | -| **总计** | **3** | **12-18** | **35分钟** | +| 批次 | 任务数 | 操作 | 预计测试数 | 预计时间 | +|----------|-------|-------------|-----------|---------| +| 第一批(异步) | 4 | 3新建+1补充 | 28-34 | 1.5小时 | +| 第二批(高优先) | 1 | 新建 | 6-8 | 15分钟 | +| 第三批(中优先) | 2 | 新建 | 6-10 | 20分钟 | +| **总计** | **7** | **6新建+1补充** | **40-54** | **2小时** | --- @@ -336,14 +370,15 @@ ### 当前状态(2026-01-18) - **现有测试数**: 496 个 -- **文件覆盖率**: 91.5% (43/47个文件有测试覆盖) -- **缺失测试**: 12-18 个 -- **已完成文件**: 43/47 +- **文件覆盖率**: 79.2% (38/48个文件有测试覆盖) +- **缺失测试**: 40-54 个 +- **已完成文件**: 38/48 +- **关键发现**: 异步命令和查询功能完全缺失测试 ### 补充测试完成后预计 -- **预计测试数**: 496 + 12-18 = 508-514 个 -- **预计文件覆盖率**: ~95.7% (45/47) +- **预计测试数**: 496 + 40-54 = 536-550 个 +- **预计文件覆盖率**: ~95.8% (46/48) - **代码行覆盖率**: 预计 90%+ (需通过覆盖率工具精确测量) --- @@ -363,11 +398,13 @@ 2. ✅ 避免与现有测试类(TestSystem, TestModel)命名冲突 3. ✅ 使用 `[SetUp]` 和 `[TearDown]` 确保测试隔离 4. ✅ 必要时使用 `[NonParallelizable]` 特性 +5. ✅ 异步测试需要正确使用 `async/await` 模式 ### 测试命名规范 - 测试类:`{Component}Tests` - 测试方法:`{Scenario}_Should_{ExpectedOutcome}` - 测试辅助类:`Test{Component}V{Version}` +- 异步测试方法建议包含 `Async` 关键字 ### 构建和验证流程 1. 编写测试代码 @@ -376,12 +413,27 @@ 4. 检查测试通过率 5. 修复失败或隔离性问题 +### 异步测试最佳实践 + +1. **正确使用 async/await** + - 测试方法标记为 `async Task` + - 所有异步操作使用 `await` + - 不要使用 `.Result` 或 `.Wait()` 导致死锁 + +2. **异常测试** + - 使用 `Assert.ThrowsAsync` 测试异步异常 + - 确保异常在正确的位置抛出 + +3. **测试辅助类** + - 创建模拟的异步命令/查询类 + - 验证异步操作是否正确执行 + - 测试并发场景(如需要) + ### 代码覆盖率工具建议 建议添加 Coverlet 代码覆盖率工具以获得精确的覆盖率数据: ```xml - all @@ -400,10 +452,11 @@ dotnet test --collect:"XPlat Code Coverage" ## 🔄 更新日志 -| 日期 | 操作 | 说明 | -|------------|------|----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| -| 2026-01-16 | 初始创建 | 生成原始测试覆盖清单(包含错误) | -| 2026-01-18 | 全面更新 | 重新检查框架和测试,修正以下问题:
1. 删除不存在的ContextAwareStateMachineTests.cs
2. 更新实际测试数量为496个
3. 添加新增源文件(AbstractAsyncCommand.cs等)
4. 修正文件覆盖率从41%提升至91.5%
5. 调整优先级,从26个减少到3个缺失测试文件 | +| 日期 | 操作 | 说明 | +|------------|-----------|-----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------| +| 2026-01-16 | 初始创建 | 生成原始测试覆盖清单(包含错误) | +| 2026-01-18 | 全面更新(第1版) | 重新检查框架和测试,修正以下问题:
1. 删除不存在的ContextAwareStateMachineTests.cs
2. 更新实际测试数量为496个
3. 添加新增源文件
4. 修正文件覆盖率从41%提升至91.5%
5. 调整优先级,从26个减少到3个缺失测试文件 | +| 2026-01-18 | 全面更新(第2版) | 补充异步命令和异步查询测试计划:
1. 发现CommandBus已有SendAsync实现但无测试
2. 发现AbstractAsyncCommand、AsyncQueryBus、AbstractAsyncQuery无测试
3. 新增4个高优先级异步测试任务
4. 更新文件覆盖率从91.5%调整为79.2%(补充异步后)
5. 总测试数从40-54调整为目标 | --- @@ -430,14 +483,21 @@ dotnet test --collect:"XPlat Code Coverage" ✅ **对象池系统** - 6个测试覆盖 ✅ **属性系统** - 8个测试覆盖 ✅ **扩展方法** - 17个测试覆盖 -✅ **命令查询系统** - 通过集成测试覆盖 +✅ **同步命令查询系统** - 通过集成测试覆盖 ✅ **模型系统** - 通过架构集成测试覆盖 ✅ **系统基类** - 通过架构集成测试覆盖 +### 待补充的异步功能 + +❌ **异步命令系统** - AbstractAsyncCommand、CommandBus.SendAsync +❌ **异步查询系统** - AsyncQueryBus、AbstractAsyncQuery +❌ **工具基类** - AbstractContextUtility +❌ **常量验证** - ArchitectureConstants、GFrameworkConstants + ### 测试质量指标 - **测试用例总数**: 496个 -- **文件级别覆盖率**: 91.5% +- **文件级别覆盖率**: 79.2% - **支持测试的.NET版本**: .NET 8.0, .NET 10.0 - **测试框架**: NUnit 3.x - **测试隔离性**: 良好 @@ -445,4 +505,24 @@ dotnet test --collect:"XPlat Code Coverage" --- -**文档维护**: 请在完成每个测试文件后更新本文档的"状态"字段 +## 🚀 实施进度 + +### 第一批:异步核心功能 + +- [ ] 任务1: CommandBusTests.cs - 补充异步测试 (4个测试) +- [ ] 任务2: AbstractAsyncCommandTests.cs (10-12个测试) +- [ ] 任务3: AsyncQueryBusTests.cs (6-8个测试) +- [ ] 任务4: AbstractAsyncQueryTests.cs (8-10个测试) + +### 第二批:工具基类 + +- [ ] 任务5: AbstractContextUtilityTests.cs (6-8个测试) + +### 第三批:常量验证 + +- [ ] 任务6: ArchitectureConstantsTests.cs (3-5个测试) +- [ ] 任务7: GFrameworkConstantsTests.cs (3-5个测试) + +--- + +**文档维护**: 请在完成每个测试任务后更新本文档的状态和实施进度 diff --git a/GFramework.Core.Tests/command/CommandBusTests.cs b/GFramework.Core.Tests/command/CommandBusTests.cs index 51d9bef..07a6f48 100644 --- a/GFramework.Core.Tests/command/CommandBusTests.cs +++ b/GFramework.Core.Tests/command/CommandBusTests.cs @@ -11,6 +11,10 @@ namespace GFramework.Core.Tests.command; /// - Send方法处理null命令 /// - Send方法(带返回值)返回值 /// - Send方法(带返回值)处理null命令 +/// - SendAsync方法执行异步命令 +/// - SendAsync方法处理null异步命令 +/// - SendAsync方法(带返回值)返回值 +/// - SendAsync方法(带返回值)处理null异步命令 /// [TestFixture] public class CommandBusTests @@ -69,6 +73,54 @@ public class CommandBusTests { Assert.Throws(() => _commandBus.Send(null!)); } + + /// + /// 测试SendAsync方法执行异步命令 + /// + [Test] + public async Task SendAsync_Should_Execute_AsyncCommand() + { + var input = new TestCommandInput { Value = 42 }; + var command = new TestAsyncCommand(input); + + await _commandBus.SendAsync(command); + + Assert.That(command.Executed, Is.True); + Assert.That(command.ExecutedValue, Is.EqualTo(42)); + } + + /// + /// 测试SendAsync方法处理null异步命令时抛出ArgumentNullException异常 + /// + [Test] + public void SendAsync_WithNullCommand_Should_ThrowArgumentNullException() + { + Assert.ThrowsAsync(async () => await _commandBus.SendAsync(null!)); + } + + /// + /// 测试SendAsync方法(带返回值)正确返回值 + /// + [Test] + public async Task SendAsync_WithResult_Should_Return_Value() + { + var input = new TestCommandInput { Value = 100 }; + var command = new TestAsyncCommandWithResult(input); + + var result = await _commandBus.SendAsync(command); + + Assert.That(command.Executed, Is.True); + Assert.That(result, Is.EqualTo(200)); + } + + /// + /// 测试SendAsync方法(带返回值)处理null异步命令时抛出ArgumentNullException异常 + /// + [Test] + public void SendAsync_WithResult_AndNullCommand_Should_ThrowArgumentNullException() + { + Assert.ThrowsAsync(async () => await _commandBus.SendAsync(null!)); + } } /// @@ -144,4 +196,70 @@ public sealed class TestCommandWithResult : AbstractCommand +/// 测试用异步命令类,继承AbstractAsyncCommand +/// +public sealed class TestAsyncCommand : AbstractAsyncCommand +{ + /// + /// 构造函数 + /// + /// 命令输入 + public TestAsyncCommand(TestCommandInput input) : base(input) + { + } + + /// + /// 获取命令是否已执行 + /// + public bool Executed { get; private set; } + + /// + /// 获取执行的值 + /// + public int ExecutedValue { get; private set; } + + /// + /// 执行异步命令的重写方法 + /// + /// 命令输入 + /// 表示异步操作的任务 + protected override Task OnExecuteAsync(TestCommandInput input) + { + Executed = true; + ExecutedValue = 42; + return Task.CompletedTask; + } +} + +/// +/// 测试用带返回值的异步命令类,继承AbstractAsyncCommand +/// +public sealed class TestAsyncCommandWithResult : AbstractAsyncCommand +{ + /// + /// 构造函数 + /// + /// 命令输入 + public TestAsyncCommandWithResult(TestCommandInput input) : base(input) + { + } + + /// + /// 获取命令是否已执行 + /// + public bool Executed { get; private set; } + + /// + /// 执行异步命令并返回结果的重写方法 + /// + /// 命令输入 + /// 执行结果的异步任务 + protected override Task OnExecuteAsync(TestCommandInput input) + { + Executed = true; + return Task.FromResult(input.Value * 2); + } } \ No newline at end of file