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")); + }); + } + /// /// 验证当 缺失时,协调器会退化到 作为稳定程序集键。 ///