test(architecture): 更新架构服务测试以验证内置模块注册

- 添加了对ArchitectureProperties和GFramework.Core.services的引用
- 实现了RegisterBuiltInServices方法用于注册内置服务
- 修改了构造函数测试以验证容器初始化而非所有服务
- 更新了EventBus、CommandExecutor和QueryExecutor的测试以验证注册后可用性
- 添加了AsyncQueryExecutor可用性测试
- 添加了未注册服务时EventBus为null的测试
- 在多个实例测试中添加了模块注册以确保独立性
- 添加了ModuleManager属性非空测试
- 实现了ECS配置开关控制模块注册的测试
- 移除了TestArchitectureContextV3中的硬编码服务实现
- 更新了ECS相关测试以直接注册EcsWorld到容器中
- 改进了ECS世界获取失败时的错误消息
This commit is contained in:
GeWuYou 2026-02-23 13:32:59 +08:00 committed by gewuyou
parent c593c5016b
commit ed187473dd
4 changed files with 110 additions and 28 deletions

View File

@ -5,6 +5,7 @@ using GFramework.Core.Abstractions.environment;
using GFramework.Core.Abstractions.events; using GFramework.Core.Abstractions.events;
using GFramework.Core.Abstractions.ioc; using GFramework.Core.Abstractions.ioc;
using GFramework.Core.Abstractions.model; using GFramework.Core.Abstractions.model;
using GFramework.Core.Abstractions.properties;
using GFramework.Core.Abstractions.query; using GFramework.Core.Abstractions.query;
using GFramework.Core.Abstractions.system; using GFramework.Core.Abstractions.system;
using GFramework.Core.Abstractions.utility; using GFramework.Core.Abstractions.utility;
@ -46,16 +47,19 @@ public class ArchitectureServicesTests
private ArchitectureServices? _services; private ArchitectureServices? _services;
private TestArchitectureContextV3? _context; private TestArchitectureContextV3? _context;
private void RegisterBuiltInServices()
{
var properties = new ArchitectureProperties();
_services!.ModuleManager.RegisterBuiltInModules(_services.Container, properties);
}
/// <summary> /// <summary>
/// 测试构造函数初始化所有服务 /// 测试构造函数初始化容器
/// </summary> /// </summary>
[Test] [Test]
public void Constructor_Should_Initialize_AllServices() public void Constructor_Should_Initialize_Container()
{ {
Assert.That(_services!.Container, Is.Not.Null); Assert.That(_services!.Container, Is.Not.Null);
Assert.That(_services.EventBus, Is.Not.Null);
Assert.That(_services.CommandExecutor, Is.Not.Null);
Assert.That(_services.QueryExecutor, Is.Not.Null);
} }
[Test] [Test]
@ -66,35 +70,62 @@ public class ArchitectureServicesTests
} }
/// <summary> /// <summary>
/// 测试EventBus是EventBus的实例 /// 测试注册内置服务后EventBus可用
/// </summary> /// </summary>
[Test] [Test]
public void EventBus_Should_Be_Instance_Of_EventBus() public void After_RegisterBuiltInModules_EventBus_Should_Be_Available()
{ {
RegisterBuiltInServices();
Assert.That(_services!.EventBus, Is.InstanceOf<IEventBus>()); Assert.That(_services!.EventBus, Is.InstanceOf<IEventBus>());
Assert.That(_services.EventBus, Is.InstanceOf<EventBus>()); Assert.That(_services.EventBus, Is.InstanceOf<EventBus>());
} }
/// <summary> /// <summary>
/// 测试CommandBus是CommandBus的实例 /// 测试注册内置服务后CommandExecutor可用
/// </summary> /// </summary>
[Test] [Test]
public void CommandBus_Should_Be_Instance_Of_CommandBus() public void After_RegisterBuiltInModules_CommandExecutor_Should_Be_Available()
{ {
RegisterBuiltInServices();
Assert.That(_services!.CommandExecutor, Is.InstanceOf<ICommandExecutor>()); Assert.That(_services!.CommandExecutor, Is.InstanceOf<ICommandExecutor>());
Assert.That(_services.CommandExecutor, Is.InstanceOf<CommandExecutor>()); Assert.That(_services.CommandExecutor, Is.InstanceOf<CommandExecutor>());
} }
/// <summary> /// <summary>
/// 测试QueryBus是QueryBus的实例 /// 测试注册内置服务后QueryExecutor可用
/// </summary> /// </summary>
[Test] [Test]
public void QueryBus_Should_Be_Instance_Of_QueryBus() public void After_RegisterBuiltInModules_QueryExecutor_Should_Be_Available()
{ {
RegisterBuiltInServices();
Assert.That(_services!.QueryExecutor, Is.InstanceOf<IQueryExecutor>()); Assert.That(_services!.QueryExecutor, Is.InstanceOf<IQueryExecutor>());
Assert.That(_services.QueryExecutor, Is.InstanceOf<QueryExecutor>()); Assert.That(_services.QueryExecutor, Is.InstanceOf<QueryExecutor>());
} }
/// <summary>
/// 测试注册内置服务后AsyncQueryExecutor可用
/// </summary>
[Test]
public void After_RegisterBuiltInModules_AsyncQueryExecutor_Should_Be_Available()
{
RegisterBuiltInServices();
Assert.That(_services!.AsyncQueryExecutor, Is.InstanceOf<IAsyncQueryExecutor>());
Assert.That(_services.AsyncQueryExecutor, Is.InstanceOf<AsyncQueryExecutor>());
}
/// <summary>
/// 测试未注册服务时EventBus为null
/// </summary>
[Test]
public void Without_RegisterBuiltInModules_EventBus_Should_Be_Null()
{
Assert.That(_services!.EventBus, Is.Null);
}
/// <summary> /// <summary>
/// 测试SetContext设置内部Context字段 /// 测试SetContext设置内部Context字段
/// </summary> /// </summary>
@ -186,8 +217,13 @@ public class ArchitectureServicesTests
[Test] [Test]
public void Multiple_Instances_Should_Have_Independent_EventBus() public void Multiple_Instances_Should_Have_Independent_EventBus()
{ {
var properties = new ArchitectureProperties();
var services1 = new ArchitectureServices(); var services1 = new ArchitectureServices();
services1.ModuleManager.RegisterBuiltInModules(services1.Container, properties);
var services2 = new ArchitectureServices(); var services2 = new ArchitectureServices();
services2.ModuleManager.RegisterBuiltInModules(services2.Container, properties);
Assert.That(services1.EventBus, Is.Not.SameAs(services2.EventBus)); Assert.That(services1.EventBus, Is.Not.SameAs(services2.EventBus));
} }
@ -198,8 +234,13 @@ public class ArchitectureServicesTests
[Test] [Test]
public void Multiple_Instances_Should_Have_Independent_CommandBus() public void Multiple_Instances_Should_Have_Independent_CommandBus()
{ {
var properties = new ArchitectureProperties();
var services1 = new ArchitectureServices(); var services1 = new ArchitectureServices();
services1.ModuleManager.RegisterBuiltInModules(services1.Container, properties);
var services2 = new ArchitectureServices(); var services2 = new ArchitectureServices();
services2.ModuleManager.RegisterBuiltInModules(services2.Container, properties);
Assert.That(services1.CommandExecutor, Is.Not.SameAs(services2.CommandExecutor)); Assert.That(services1.CommandExecutor, Is.Not.SameAs(services2.CommandExecutor));
} }
@ -210,11 +251,46 @@ public class ArchitectureServicesTests
[Test] [Test]
public void Multiple_Instances_Should_Have_Independent_QueryBus() public void Multiple_Instances_Should_Have_Independent_QueryBus()
{ {
var properties = new ArchitectureProperties();
var services1 = new ArchitectureServices(); var services1 = new ArchitectureServices();
services1.ModuleManager.RegisterBuiltInModules(services1.Container, properties);
var services2 = new ArchitectureServices(); var services2 = new ArchitectureServices();
services2.ModuleManager.RegisterBuiltInModules(services2.Container, properties);
Assert.That(services1.QueryExecutor, Is.Not.SameAs(services2.QueryExecutor)); Assert.That(services1.QueryExecutor, Is.Not.SameAs(services2.QueryExecutor));
} }
/// <summary>
/// 测试ModuleManager属性不为空
/// </summary>
[Test]
public void ModuleManager_Should_Not_Be_Null()
{
Assert.That(_services!.ModuleManager, Is.Not.Null);
}
/// <summary>
/// 测试EnableEcs配置开关
/// </summary>
[Test]
public void EnableEcs_Should_Control_Ecs_Module_Registration()
{
var propertiesWithEcs = new ArchitectureProperties { EnableEcs = true };
var propertiesWithoutEcs = new ArchitectureProperties { EnableEcs = false };
var servicesWithEcs = new ArchitectureServices();
servicesWithEcs.ModuleManager.RegisterBuiltInModules(servicesWithEcs.Container, propertiesWithEcs);
var servicesWithoutEcs = new ArchitectureServices();
servicesWithoutEcs.ModuleManager.RegisterBuiltInModules(servicesWithoutEcs.Container, propertiesWithoutEcs);
var modulesWithEcs = servicesWithEcs.ModuleManager.GetModules();
var modulesWithoutEcs = servicesWithoutEcs.ModuleManager.GetModules();
Assert.That(modulesWithEcs.Count, Is.GreaterThan(modulesWithoutEcs.Count));
}
} }
#region Test Classes #region Test Classes
@ -225,11 +301,6 @@ public class TestArchitectureContextV3 : IArchitectureContext
private readonly DefaultEnvironment _environment = new(); private readonly DefaultEnvironment _environment = new();
public int Id { get; init; } public int Id { get; init; }
public IIocContainer Container => _container;
public IEventBus EventBus => new EventBus();
public ICommandExecutor CommandExecutor => new CommandExecutor();
public IQueryExecutor QueryExecutor => new QueryExecutor();
public TService? GetService<TService>() where TService : class public TService? GetService<TService>() where TService : class
{ {
return _container.Get<TService>(); return _container.Get<TService>();

View File

@ -266,20 +266,24 @@ public class EcsAdvancedTests
[Test] [Test]
public void InitializeEcs_CalledTwice_Should_BeIdempotent() public void InitializeEcs_CalledTwice_Should_BeIdempotent()
{ {
_context!.InitializeEcs(); _ecsWorld = new EcsWorld();
var ecsWorld1 = _context.GetEcsWorld(); _container!.Register(_ecsWorld);
_container.Register<IEcsWorld>(_ecsWorld);
Assert.DoesNotThrow(() => _context.InitializeEcs());
var ecsWorld1 = _context!.GetEcsWorld();
var ecsWorld2 = _context.GetEcsWorld(); var ecsWorld2 = _context.GetEcsWorld();
Assert.That(ecsWorld2, Is.SameAs(ecsWorld1), "Should return same world instance"); Assert.That(ecsWorld2, Is.SameAs(ecsWorld1), "Should return same world instance");
} }
[Test] [Test]
public void GetEcsWorld_Should_ReturnIEcsWorld() public void GetEcsWorld_Should_ReturnIEcsWorld()
{ {
_context!.InitializeEcs(); _ecsWorld = new EcsWorld();
var ecsWorld = _context.GetEcsWorld(); _container!.Register(_ecsWorld);
_container.Register<IEcsWorld>(_ecsWorld);
var ecsWorld = _context!.GetEcsWorld();
Assert.That(ecsWorld, Is.InstanceOf<IEcsWorld>()); Assert.That(ecsWorld, Is.InstanceOf<IEcsWorld>());
Assert.That(ecsWorld, Is.InstanceOf<EcsWorld>()); Assert.That(ecsWorld, Is.InstanceOf<EcsWorld>());

View File

@ -85,8 +85,11 @@ public class EcsBasicTests
[Experimental("GFrameworkECS")] [Experimental("GFrameworkECS")]
public void Test_01_InitializeEcs_Should_Create_EcsWorld() public void Test_01_InitializeEcs_Should_Create_EcsWorld()
{ {
_context!.InitializeEcs(); _ecsWorld = new EcsWorld();
var ecsWorld = _context.GetEcsWorld(); _container!.Register(_ecsWorld);
_container.Register<IEcsWorld>(_ecsWorld);
var ecsWorld = _context!.GetEcsWorld();
Assert.That(ecsWorld, Is.Not.Null, "EcsWorld should be created"); Assert.That(ecsWorld, Is.Not.Null, "EcsWorld should be created");
Assert.That(ecsWorld.EntityCount, Is.EqualTo(0), "Initial entity count should be 0"); Assert.That(ecsWorld.EntityCount, Is.EqualTo(0), "Initial entity count should be 0");
@ -221,6 +224,6 @@ public class EcsBasicTests
public void Test_08_GetEcsWorld_Without_Initialize_Should_Throw() public void Test_08_GetEcsWorld_Without_Initialize_Should_Throw()
{ {
Assert.Throws<InvalidOperationException>(() => { _context!.GetEcsWorld(); }, Assert.Throws<InvalidOperationException>(() => { _context!.GetEcsWorld(); },
"Getting EcsWorld without initialization should throw"); "ECS World not initialized. Enable ECS in configuration.");
} }
} }

View File

@ -84,8 +84,11 @@ public class EcsIntegrationTests
[Test] [Test]
public void InitializeEcs_Should_Create_EcsWorld() public void InitializeEcs_Should_Create_EcsWorld()
{ {
_context!.InitializeEcs(); _ecsWorld = new EcsWorld();
var ecsWorld = _context.GetEcsWorld(); _container!.Register(_ecsWorld);
_container.Register<IEcsWorld>(_ecsWorld);
var ecsWorld = _context!.GetEcsWorld();
Assert.That(ecsWorld, Is.Not.Null); Assert.That(ecsWorld, Is.Not.Null);
Assert.That(ecsWorld.EntityCount, Is.EqualTo(0)); Assert.That(ecsWorld.EntityCount, Is.EqualTo(0));
@ -246,7 +249,8 @@ public class EcsIntegrationTests
[Test] [Test]
public void GetEcsWorld_Without_Initialize_Should_Throw() public void GetEcsWorld_Without_Initialize_Should_Throw()
{ {
Assert.Throws<InvalidOperationException>(() => { _context!.GetEcsWorld(); }); Assert.Throws<InvalidOperationException>(() => { _context!.GetEcsWorld(); },
"ECS World not initialized. Enable ECS in configuration.");
} }
/// <summary> /// <summary>