diff --git a/GFramework.Core.Tests/TEST_COVERAGE_PLAN.md b/GFramework.Core.Tests/TEST_COVERAGE_PLAN.md index 09ac233..45da38b 100644 --- a/GFramework.Core.Tests/TEST_COVERAGE_PLAN.md +++ b/GFramework.Core.Tests/TEST_COVERAGE_PLAN.md @@ -1,8 +1,8 @@ # GFramework.Core 模块测试覆盖详细清单 - + > **生成日期**: 2026-01-16 > **最后更新**: 2026-01-16 -> **当前版本**: Core测试覆盖率 ~42% +> **当前版本**: Core测试覆盖率 ~44% > **目标**: 提升Core模块测试覆盖率至 85%+ --- @@ -116,18 +116,20 @@ - ✅ SetContext 方法 - 设置上下文 - ✅ SetContext 方法 - 重复设置上下文 - ✅ GetContext 方法 - 获取已设置上下文 -- ✅ GetContext 方法 - 未设置上下文时抛出异常 +- ✅ GetContext 方法 - 未设置上下文时返回null - ✅ 上下文传播到容器 - ✅ IArchitectureServices 接口实现验证 - ✅ 服务独立性验证(多个实例) **预计测试数**: 10-12 个 +**实际测试数**: 15 个 + **优先级**: 🔴 高 **创建路径**: `GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs` -**状态**: ❌ 待创建 +**状态**: ✅ 已创建 --- @@ -758,19 +760,23 @@ ## 🎯 目标达成路径 ### 当前状态 -- **现有测试数**: 262 个 -- **测试覆盖率**: ~43% -- **缺失测试**: 146-202 个 -- **已完成文件**: 2/26 (ArchitectureConfigurationTests.cs, ArchitectureContextTests.cs) +- **现有测试数**: 277 个 +- **测试覆盖率**: ~44% +- **缺失测试**: 131-187 个 +- **已完成文件**: 3/26 (ArchitectureConfigurationTests.cs, ArchitectureContextTests.cs, ArchitectureServicesTests.cs) ### 第一批完成 1/5 -- **当前测试数**: 262 个 -- **当前覆盖率**: ~43% +- **当前测试数**: 240 个 +- **当前覆盖率**: ~42% ### 第一批完成 2/5 - **当前测试数**: 262 个 - **当前覆盖率**: ~43% +### 第一批完成 3/5 +- **当前测试数**: 277 个 +- **当前覆盖率**: ~44% + ### 第一批完成后 - **预计测试数**: 228 + 53-67 = 281-295 个 - **预计覆盖率**: ~50-55% @@ -821,11 +827,12 @@ ## 🔄 更新日志 -| 日期 | 操作 | 说明 | + | 日期 | 操作 | 说明 | |-----|------|------| | 2026-01-16 | 初始创建 | 生成完整测试覆盖清单 | | 2026-01-16 | 完成 ArchitectureConfigurationTests.cs | 创建了12个测试用例,涵盖默认配置、自定义配置、接口实现验证等功能 | | 2026-01-16 | 完成 ArchitectureContextTests.cs | 创建了22个测试用例,涵盖构造函数、命令/查询/事件发送、组件获取等功能 | +| 2026-01-16 | 完成 ArchitectureServicesTests.cs | 创建了15个测试用例,涵盖服务初始化、上下文管理、服务独立性等功能 | | | | | --- diff --git a/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs b/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs new file mode 100644 index 0000000..fffa567 --- /dev/null +++ b/GFramework.Core.Tests/architecture/ArchitectureServicesTests.cs @@ -0,0 +1,203 @@ +using System; +using GFramework.Core.Abstractions.architecture; +using GFramework.Core.Abstractions.command; +using GFramework.Core.Abstractions.environment; +using GFramework.Core.Abstractions.events; +using GFramework.Core.Abstractions.ioc; +using GFramework.Core.Abstractions.model; +using GFramework.Core.Abstractions.query; +using GFramework.Core.Abstractions.system; +using GFramework.Core.Abstractions.utility; +using GFramework.Core.architecture; +using GFramework.Core.command; +using GFramework.Core.environment; +using GFramework.Core.events; +using GFramework.Core.ioc; +using GFramework.Core.query; +using NUnit.Framework; + +namespace GFramework.Core.Tests.architecture; + +[TestFixture] +public class ArchitectureServicesTests +{ + private ArchitectureServices? _services; + private TestArchitectureContextV3? _context; + + [SetUp] + public void SetUp() + { + _services = new ArchitectureServices(); + _context = new TestArchitectureContextV3(); + } + + [Test] + public void Constructor_Should_Initialize_AllServices() + { + Assert.That(_services!.Container, Is.Not.Null); + Assert.That(_services.EventBus, Is.Not.Null); + Assert.That(_services.CommandBus, Is.Not.Null); + Assert.That(_services.QueryBus, Is.Not.Null); + } + + [Test] + public void Container_Should_Be_Instance_Of_IocContainer() + { + Assert.That(_services!.Container, Is.InstanceOf()); + Assert.That(_services.Container, Is.InstanceOf()); + } + + [Test] + public void EventBus_Should_Be_Instance_Of_EventBus() + { + Assert.That(_services!.EventBus, Is.InstanceOf()); + Assert.That(_services.EventBus, Is.InstanceOf()); + } + + [Test] + public void CommandBus_Should_Be_Instance_Of_CommandBus() + { + Assert.That(_services!.CommandBus, Is.InstanceOf()); + Assert.That(_services.CommandBus, Is.InstanceOf()); + } + + [Test] + public void QueryBus_Should_Be_Instance_Of_QueryBus() + { + Assert.That(_services!.QueryBus, Is.InstanceOf()); + Assert.That(_services.QueryBus, Is.InstanceOf()); + } + + [Test] + public void SetContext_Should_Set_Context_Internal_Field() + { + _services!.SetContext(_context!); + + var context = _services.GetContext(); + Assert.That(context, Is.SameAs(_context)); + } + + [Test] + public void SetContext_Should_Propagate_Context_To_Container() + { + _services!.SetContext(_context!); + + var containerContext = _services.Container.GetContext(); + Assert.That(containerContext, Is.SameAs(_context)); + } + + [Test] + public void GetContext_Should_Return_Context_After_SetContext() + { + _services!.SetContext(_context!); + + var context = _services.GetContext(); + Assert.That(context, Is.Not.Null); + Assert.That(context, Is.SameAs(_context)); + } + + [Test] + public void GetContext_Should_ReturnNull_When_Context_Not_Set() + { + var context = _services!.GetContext(); + + Assert.That(context, Is.Null); + } + + [Test] + public void SetContext_Should_Replace_Existing_Context() + { + var context1 = new TestArchitectureContextV3 { Id = 1 }; + var context2 = new TestArchitectureContextV3 { Id = 2 }; + + _services!.SetContext(context1); + _services.SetContext(context2); + + var context = _services.GetContext(); + Assert.That(context, Is.SameAs(context2)); + } + + [Test] + public void ArchitectureServices_Should_Implement_IArchitectureServices_Interface() + { + Assert.That(_services, Is.InstanceOf()); + } + + [Test] + public void Multiple_Instances_Should_Have_Independent_Container() + { + var services1 = new ArchitectureServices(); + var services2 = new ArchitectureServices(); + + Assert.That(services1.Container, Is.Not.SameAs(services2.Container)); + } + + [Test] + public void Multiple_Instances_Should_Have_Independent_EventBus() + { + var services1 = new ArchitectureServices(); + var services2 = new ArchitectureServices(); + + Assert.That(services1.EventBus, Is.Not.SameAs(services2.EventBus)); + } + + [Test] + public void Multiple_Instances_Should_Have_Independent_CommandBus() + { + var services1 = new ArchitectureServices(); + var services2 = new ArchitectureServices(); + + Assert.That(services1.CommandBus, Is.Not.SameAs(services2.CommandBus)); + } + + [Test] + public void Multiple_Instances_Should_Have_Independent_QueryBus() + { + var services1 = new ArchitectureServices(); + var services2 = new ArchitectureServices(); + + Assert.That(services1.QueryBus, Is.Not.SameAs(services2.QueryBus)); + } +} + +#region Test Classes + +public class TestArchitectureContextV3 : IArchitectureContext +{ + private readonly IocContainer _container = new(); + private readonly DefaultEnvironment _environment = new(); + public int Id { get; init; } + + public IIocContainer Container => _container; + public IEventBus EventBus => new EventBus(); + public ICommandBus CommandBus => new CommandBus(); + public IQueryBus QueryBus => new QueryBus(); + + public TModel? GetModel() where TModel : class, IModel => _container.Get(); + public TSystem? GetSystem() where TSystem : class, ISystem => _container.Get(); + public TUtility? GetUtility() where TUtility : class, IUtility => _container.Get(); + + public void SendEvent() where TEvent : new() + { + } + + public void SendEvent(TEvent e) where TEvent : class + { + } + + public IUnRegister RegisterEvent(Action handler) => new DefaultUnRegister(() => { }); + + public void UnRegisterEvent(Action onEvent) + { + } + + public void SendCommand(ICommand command) + { + } + + public TResult SendCommand(ICommand command) => default!; + public TResult SendQuery(IQuery query) => default!; + public IEnvironment GetEnvironment() => _environment; +} + +#endregion