From 75e7785592ac5600700f28f00411a39583d01d57 Mon Sep 17 00:00:00 2001
From: gewuyou <95328647+GeWuYou@users.noreply.github.com>
Date: Tue, 12 May 2026 08:36:18 +0800
Subject: [PATCH] =?UTF-8?q?test(cqrs):=20=E8=A1=A5=E5=85=85=E6=B3=A8?=
=?UTF-8?q?=E5=86=8C=E6=9C=8D=E5=8A=A1=E8=BE=B9=E7=95=8C=E6=B5=8B=E8=AF=95?=
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
- 补充空程序集输入时不触发 registrar 的回归测试
- 验证忽略空项后按稳定程序集键排序并去重的注册顺序
- 验证跨调用跳过已注册程序集键时仍继续处理剩余新程序集
---
.../Cqrs/CqrsRegistrationServiceTests.cs | 94 +++++++++++++++++++
1 file changed, 94 insertions(+)
diff --git a/GFramework.Cqrs.Tests/Cqrs/CqrsRegistrationServiceTests.cs b/GFramework.Cqrs.Tests/Cqrs/CqrsRegistrationServiceTests.cs
index 35f15736..82bf3253 100644
--- a/GFramework.Cqrs.Tests/Cqrs/CqrsRegistrationServiceTests.cs
+++ b/GFramework.Cqrs.Tests/Cqrs/CqrsRegistrationServiceTests.cs
@@ -13,6 +13,24 @@ namespace GFramework.Cqrs.Tests.Cqrs;
[TestFixture]
internal sealed class CqrsRegistrationServiceTests
{
+ ///
+ /// 验证空程序集输入不会触发底层注册,也不会产生重复跳过日志。
+ ///
+ [Test]
+ public void RegisterHandlers_Should_Not_Invoke_Registrar_When_Assemblies_Are_Empty()
+ {
+ var logger = new TestLogger("DefaultCqrsRegistrationService", LogLevel.Debug);
+ var registrar = new Mock(MockBehavior.Strict);
+ var service = CqrsRuntimeFactory.CreateRegistrationService(registrar.Object, logger);
+
+ service.RegisterHandlers([]);
+
+ registrar.Verify(
+ static currentRegistrar => currentRegistrar.RegisterHandlers(It.IsAny>()),
+ Times.Never);
+ Assert.That(logger.Logs, Has.Count.EqualTo(0));
+ }
+
///
/// 验证同一次调用内出现重复程序集键时,底层注册器只会接收到一次注册请求。
///
@@ -87,6 +105,82 @@ internal sealed class CqrsRegistrationServiceTests
});
}
+ ///
+ /// 验证协调器会忽略空项,并按稳定程序集键排序后仅注册当前调用内的唯一程序集。
+ ///
+ [Test]
+ public void RegisterHandlers_Should_Ignore_Null_Entries_And_Register_Unique_Assemblies_In_Stable_Key_Order()
+ {
+ var logger = new TestLogger("DefaultCqrsRegistrationService", LogLevel.Debug);
+ var registrar = new Mock(MockBehavior.Strict);
+ var assemblyC = CreateAssembly("GFramework.Cqrs.Tests.Sorting.C, Version=1.0.0.0");
+ var assemblyA = CreateAssembly("GFramework.Cqrs.Tests.Sorting.A, Version=1.0.0.0");
+ var duplicateAssemblyA = CreateAssembly("GFramework.Cqrs.Tests.Sorting.A, Version=1.0.0.0");
+ var assemblyB = CreateAssembly("GFramework.Cqrs.Tests.Sorting.B, Version=1.0.0.0");
+ var registeredAssemblies = new List();
+
+ registrar
+ .Setup(static currentRegistrar => currentRegistrar.RegisterHandlers(It.IsAny>()))
+ .Callback>(assemblies => registeredAssemblies.AddRange(assemblies));
+
+ var service = CqrsRuntimeFactory.CreateRegistrationService(registrar.Object, logger);
+
+ service.RegisterHandlers([assemblyC.Object, null!, assemblyA.Object, duplicateAssemblyA.Object, assemblyB.Object, null!]);
+
+ registrar.Verify(
+ static currentRegistrar => currentRegistrar.RegisterHandlers(It.IsAny>()),
+ Times.Exactly(3));
+ Assert.Multiple(() =>
+ {
+ Assert.That(
+ registeredAssemblies,
+ Is.EqualTo([assemblyA.Object, assemblyB.Object, assemblyC.Object]));
+ Assert.That(logger.Logs, Has.Count.EqualTo(0));
+ });
+ }
+
+ ///
+ /// 验证跨调用遇到已注册程序集键时,协调器会跳过重复项,同时继续按稳定程序集键顺序处理剩余新程序集。
+ ///
+ [Test]
+ public void RegisterHandlers_Should_Skip_Previously_Registered_Keys_And_Keep_Stable_Order_For_Remaining_Assemblies()
+ {
+ var logger = new TestLogger("DefaultCqrsRegistrationService", LogLevel.Debug);
+ var registrar = new Mock(MockBehavior.Strict);
+ var firstAssembly = CreateAssembly("GFramework.Cqrs.Tests.Sorting.B, Version=1.0.0.0");
+ var duplicateAssembly = CreateAssembly("GFramework.Cqrs.Tests.Sorting.B, Version=1.0.0.0");
+ var assemblyC = CreateAssembly("GFramework.Cqrs.Tests.Sorting.C, Version=1.0.0.0");
+ var assemblyA = CreateAssembly("GFramework.Cqrs.Tests.Sorting.A, Version=1.0.0.0");
+ var registeredAssemblies = new List();
+
+ registrar
+ .Setup(static currentRegistrar => currentRegistrar.RegisterHandlers(It.IsAny>()))
+ .Callback>(assemblies => registeredAssemblies.AddRange(assemblies));
+
+ var service = CqrsRuntimeFactory.CreateRegistrationService(registrar.Object, logger);
+
+ service.RegisterHandlers([firstAssembly.Object]);
+ service.RegisterHandlers([assemblyC.Object, duplicateAssembly.Object, assemblyA.Object]);
+
+ registrar.Verify(
+ static currentRegistrar => currentRegistrar.RegisterHandlers(It.IsAny>()),
+ Times.Exactly(3));
+ Assert.Multiple(() =>
+ {
+ Assert.That(
+ registeredAssemblies,
+ Is.EqualTo([firstAssembly.Object, assemblyA.Object, assemblyC.Object]));
+ var debugMessages = logger.Logs
+ .Where(static log => log.Level == LogLevel.Debug)
+ .Select(static log => log.Message)
+ .ToArray();
+ Assert.That(debugMessages, Has.Length.EqualTo(1));
+ Assert.That(
+ debugMessages[0],
+ Does.Contain("GFramework.Cqrs.Tests.Sorting.B, Version=1.0.0.0"));
+ });
+ }
+
///
/// 验证当 缺失时,协调器会退化到 作为稳定程序集键。
///