From e19f4ce5a1a784f8a58d4d9a8033c77c4cf9f5c1 Mon Sep 17 00:00:00 2001 From: GwWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Fri, 2 Jan 2026 12:17:15 +0800 Subject: [PATCH] =?UTF-8?q?refactor(architecture):=20=E9=87=8D=E6=9E=84?= =?UTF-8?q?=E6=9E=B6=E6=9E=84=E5=88=9D=E5=A7=8B=E5=8C=96=E6=96=B9=E6=B3=95?= =?UTF-8?q?=E5=92=8C=E6=B5=8B=E8=AF=95=E5=9F=BA=E7=B1=BB?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 将InitializeAsync方法改为真正的异步方法并正确等待内部初始化 - 移除多余的返回语句以符合异步模式 - 创建TestArchitectureBase基类来统一测试架构的公共功能 - 将AsyncTestArchitecture和SyncTestArchitecture继承自TestArchitectureBase - 移除重复的属性和方法实现 - 添加完整的异步架构测试用例 - 包括组件初始化、阶段转换、异常处理等测试场景 --- .../architecture/AsyncTestArchitecture.cs | 39 +----- .../architecture/SyncTestArchitecture.cs | 46 +------ .../architecture/TestArchitectureBase.cs | 55 ++++++++ .../tests/AsyncArchitectureTests.cs | 123 +++++++++++++++++- GFramework.Core/architecture/Architecture.cs | 5 +- 5 files changed, 182 insertions(+), 86 deletions(-) create mode 100644 GFramework.Core.Tests/architecture/TestArchitectureBase.cs diff --git a/GFramework.Core.Tests/architecture/AsyncTestArchitecture.cs b/GFramework.Core.Tests/architecture/AsyncTestArchitecture.cs index 8065271..52b09c1 100644 --- a/GFramework.Core.Tests/architecture/AsyncTestArchitecture.cs +++ b/GFramework.Core.Tests/architecture/AsyncTestArchitecture.cs @@ -1,7 +1,4 @@ -using GFramework.Core.Abstractions.enums; -using GFramework.Core.architecture; -using GFramework.Core.events; -using GFramework.Core.Tests.model; +using GFramework.Core.Tests.model; using GFramework.Core.Tests.system; namespace GFramework.Core.Tests.architecture; @@ -9,47 +6,17 @@ namespace GFramework.Core.Tests.architecture; /// /// 异步测试架构,用于测试异步模型和系统的初始化 /// -public class AsyncTestArchitecture : Architecture +public class AsyncTestArchitecture : TestArchitectureBase { - /// - /// 初始化完成事件是否触发 - /// - public bool ReadyEventFired { get; private set; } - - /// - /// Init 方法是否调用 - /// - public bool InitCalled { get; private set; } - - /// - /// 阶段进入记录 - /// - public List PhaseHistory { get; } = new(); - /// /// 异步初始化架构 /// protected override void Init() { - InitCalled = true; - // 注册模型 RegisterModel(new AsyncTestModel()); - // 注册系统 RegisterSystem(new AsyncTestSystem()); - - // 订阅 Ready 事件 - Context.RegisterEvent(_ => { ReadyEventFired = true; }); - } - - /// - /// 进入阶段时记录 - /// - /// - protected override void EnterPhase(ArchitecturePhase next) - { - base.EnterPhase(next); - PhaseHistory.Add(next); + base.Init(); } } \ No newline at end of file diff --git a/GFramework.Core.Tests/architecture/SyncTestArchitecture.cs b/GFramework.Core.Tests/architecture/SyncTestArchitecture.cs index a19c94e..e9d2d60 100644 --- a/GFramework.Core.Tests/architecture/SyncTestArchitecture.cs +++ b/GFramework.Core.Tests/architecture/SyncTestArchitecture.cs @@ -1,7 +1,4 @@ -using GFramework.Core.Abstractions.enums; -using GFramework.Core.architecture; -using GFramework.Core.events; -using GFramework.Core.Tests.model; +using GFramework.Core.Tests.model; using GFramework.Core.Tests.system; namespace GFramework.Core.Tests.architecture; @@ -9,52 +6,15 @@ namespace GFramework.Core.Tests.architecture; /// /// 同步测试架构类,用于测试架构的生命周期和事件处理 /// -public sealed class SyncTestArchitecture : Architecture +public sealed class SyncTestArchitecture : TestArchitectureBase { - private Action? _postRegistrationHook; - - /// - /// 获取就绪事件是否已触发的状态 - /// - public bool ReadyEventFired { get; private set; } - - /// - /// 获取初始化方法是否已调用的状态 - /// - public bool InitCalled { get; private set; } - - /// - /// 获取架构阶段历史记录列表 - /// - public List PhaseHistory { get; } = []; - - /// - /// 添加注册后钩子函数 - /// - /// 要添加的钩子函数 - public void AddPostRegistrationHook(Action hook) => _postRegistrationHook = hook; - /// /// 初始化架构组件,注册模型、系统并设置事件监听器 /// protected override void Init() { - InitCalled = true; - RegisterModel(new TestModel()); RegisterSystem(new TestSystem()); - _postRegistrationHook?.Invoke(this); - Context.RegisterEvent(_ => { ReadyEventFired = true; }); - } - - /// - /// 进入指定架构阶段时的处理方法,记录阶段历史 - /// - /// 要进入的下一个架构阶段 - protected override void EnterPhase(ArchitecturePhase next) - { - base.EnterPhase(next); - // 记录进入的架构阶段到历史列表中 - PhaseHistory.Add(next); + base.Init(); } } \ No newline at end of file diff --git a/GFramework.Core.Tests/architecture/TestArchitectureBase.cs b/GFramework.Core.Tests/architecture/TestArchitectureBase.cs new file mode 100644 index 0000000..251cbb9 --- /dev/null +++ b/GFramework.Core.Tests/architecture/TestArchitectureBase.cs @@ -0,0 +1,55 @@ +using GFramework.Core.Abstractions.enums; +using GFramework.Core.architecture; +using GFramework.Core.events; + +namespace GFramework.Core.Tests.architecture; + +/// +/// 测试架构基类,提供通用的测试架构功能 +/// +public abstract class TestArchitectureBase : Architecture +{ + private Action? _postRegistrationHook; + + /// + /// 获取就绪事件是否已触发的状态 + /// + public bool ReadyEventFired { get; protected set; } + + /// + /// 获取初始化方法是否已调用的状态 + /// + public bool InitCalled { get; protected set; } + + /// + /// 获取架构阶段历史记录列表 + /// + public List PhaseHistory { get; } = []; + + /// + /// 添加注册后钩子函数 + /// + /// 要添加的钩子函数 + public void AddPostRegistrationHook(Action hook) => _postRegistrationHook = hook; + + /// + /// 初始化架构组件,注册模型、系统并设置事件监听器 + /// + protected override void Init() + { + InitCalled = true; + _postRegistrationHook?.Invoke(this); + Context.RegisterEvent(_ => { ReadyEventFired = true; }); + } + + /// + /// 进入指定架构阶段时的处理方法,记录阶段历史 + /// + /// 要进入的下一个架构阶段 + protected override void EnterPhase(ArchitecturePhase next) + { + base.EnterPhase(next); + // 记录进入的架构阶段到历史列表中 + PhaseHistory.Add(next); + } +} \ No newline at end of file diff --git a/GFramework.Core.Tests/tests/AsyncArchitectureTests.cs b/GFramework.Core.Tests/tests/AsyncArchitectureTests.cs index c01d6ba..bb027e0 100644 --- a/GFramework.Core.Tests/tests/AsyncArchitectureTests.cs +++ b/GFramework.Core.Tests/tests/AsyncArchitectureTests.cs @@ -1,5 +1,9 @@ -using GFramework.Core.Tests.architecture; +using GFramework.Core.Abstractions.enums; +using GFramework.Core.Tests.architecture; +using GFramework.Core.Tests.model; +using GFramework.Core.Tests.system; using NUnit.Framework; +using NUnit.Framework.Legacy; namespace GFramework.Core.Tests.tests; @@ -20,11 +24,122 @@ public class AsyncArchitectureTests : ArchitectureTestsBase new(); /// - /// 初始化架构的异步方法 + /// 测试架构是否正确初始化所有组件 /// - /// 表示异步操作的Task - protected override async Task InitializeArchitecture() + /// 异步任务 + [Test] + public async Task Architecture_Should_Initialize_All_Components_Correctly() { await Architecture!.InitializeAsync(); + + Assert.That(Architecture.InitCalled, Is.True); + Assert.That(Architecture.Runtime, Is.Not.Null); + Assert.That(Architecture.CurrentPhase, Is.EqualTo(ArchitecturePhase.Ready)); + + var context = Architecture.Context; + + var model = context.GetModel(); + Assert.That(model!.Initialized, Is.True); + + var system = context.GetSystem(); + Assert.That(system!.Initialized, Is.True); + } + + /// + /// 测试架构是否按正确顺序进入各个阶段 + /// + /// 异步任务 + [Test] + public async Task Architecture_Should_Enter_Phases_In_Correct_Order() + { + await Architecture!.InitializeAsync(); + + // 验证架构阶段历史记录是否符合预期顺序 + CollectionAssert.AreEqual( + new[] + { + ArchitecturePhase.BeforeModelInit, + ArchitecturePhase.AfterModelInit, + ArchitecturePhase.BeforeSystemInit, + ArchitecturePhase.AfterSystemInit, + ArchitecturePhase.Ready + }, + Architecture.PhaseHistory + ); + } + + /// + /// 测试在就绪状态后注册模型是否抛出异常 + /// + /// 异步任务 + [Test] + public async Task RegisterModel_AfterReady_Should_Throw() + { + await Architecture!.InitializeAsync(); + + Assert.Throws(() => Architecture.RegisterModel(new TestModel()) + ); + } + + /// + /// 测试当模型初始化失败时架构是否停止初始化 + /// + /// 异步任务 + [Test] + public async Task Architecture_Should_Stop_Initialization_When_Model_Init_Fails() + { + Architecture!.AddPostRegistrationHook(a => { a.RegisterModel(new FailingModel()); }); + + await Architecture.InitializeAsync(); + + Assert.That( + Architecture.CurrentPhase, + Is.EqualTo(ArchitecturePhase.FailedInitialization) + ); + } + + /// + /// 测试架构销毁是否正确销毁所有系统 + /// + /// 异步任务 + [Test] + public async Task Architecture_Destroy_Should_Destroy_All_Systems() + { + await Architecture!.InitializeAsync(); + Architecture.Destroy(); + + var system = Architecture.Context.GetSystem(); + Assert.That(system, Is.Null); + Assert.That(Architecture.CurrentPhase, Is.EqualTo(ArchitecturePhase.Destroyed)); + } + + /// + /// 测试InitializeAsync方法是否不会阻塞 + /// + /// 异步任务 + [Test] + public async Task InitializeAsync_Should_Not_Block() + { + var task = Architecture!.InitializeAsync(); + + Assert.That(task.IsCompleted, Is.False); + await task; + } + + /// + /// 测试InitializeAsync方法是否正确处理异常 + /// + /// 异步任务 + [Test] + public async Task InitializeAsync_Should_Handle_Exception_Correctly() + { + Architecture!.AddPostRegistrationHook(a => { a.RegisterModel(new FailingModel()); }); + + await Architecture.InitializeAsync(); + + Assert.That( + Architecture.CurrentPhase, + Is.EqualTo(ArchitecturePhase.FailedInitialization) + ); } } \ No newline at end of file diff --git a/GFramework.Core/architecture/Architecture.cs b/GFramework.Core/architecture/Architecture.cs index 1638474..d067772 100644 --- a/GFramework.Core/architecture/Architecture.cs +++ b/GFramework.Core/architecture/Architecture.cs @@ -253,11 +253,11 @@ public abstract class Architecture( /// 异步初始化方法,返回Task以便调用者可以等待初始化完成 /// /// 表示异步初始化操作的Task - public Task InitializeAsync() + public async Task InitializeAsync() { try { - return InitializeInternalAsync(asyncMode: true); + await InitializeInternalAsync(asyncMode: true); } catch (Exception e) { @@ -265,7 +265,6 @@ public abstract class Architecture( EnterPhase(ArchitecturePhase.FailedInitialization); // 发送初始化失败事件 TypeEventSystem.Send(new ArchitectureEvents.ArchitectureFailedInitializationEvent()); - return Task.CompletedTask; } }