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;
}
}