From 45bcffc6ee958f5b8cd2fa49be1b7ec762d99612 Mon Sep 17 00:00:00 2001 From: GeWuYou <95328647+GeWuYou@users.noreply.github.com> Date: Thu, 16 Apr 2026 19:06:34 +0800 Subject: [PATCH] =?UTF-8?q?test(cqrs):=20=E6=B7=BB=E5=8A=A0=20CQRS=20?= =?UTF-8?q?=E5=A4=84=E7=90=86=E5=99=A8=E6=B3=A8=E5=86=8C=E7=94=9F=E6=88=90?= =?UTF-8?q?=E5=99=A8=E6=B5=8B=E8=AF=95?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - 创建 MetadataReferenceTestBuilder 工具类用于构建内存元数据引用 - 实现 CreateFromSource 方法将源码编译为内存程序集并返回元数据引用 - 添加 GetRuntimeMetadataReferences 方法获取当前运行时可信平台程序集引用 - 创建 CqrsHandlerRegistryGeneratorTests 测试类验证 CQRS 处理器注册生成器功能 - 添加多种测试用例验证不同场景下的处理器注册行为 - 包含嵌套处理器、隐藏实现、数组类型参数、泛型类型定义等边界情况测试 - 实现混合直接注册和精确重建注册的测试验证 - 添加对外部基类保护类型处理器的支持测试 - 验证生成器优先处理隐藏处理器而不输出遗留回退标记的功能 --- .../Core/MetadataReferenceTestBuilder.cs | 13 +++++++++++-- .../Cqrs/CqrsHandlerRegistryGeneratorTests.cs | 7 +++++-- 2 files changed, 16 insertions(+), 4 deletions(-) diff --git a/GFramework.SourceGenerators.Tests/Core/MetadataReferenceTestBuilder.cs b/GFramework.SourceGenerators.Tests/Core/MetadataReferenceTestBuilder.cs index 173a88d9..45fd506a 100644 --- a/GFramework.SourceGenerators.Tests/Core/MetadataReferenceTestBuilder.cs +++ b/GFramework.SourceGenerators.Tests/Core/MetadataReferenceTestBuilder.cs @@ -1,6 +1,5 @@ using System.Collections.Immutable; using System.IO; -using Microsoft.CodeAnalysis.CSharp; namespace GFramework.SourceGenerators.Tests.Core; @@ -9,6 +8,11 @@ namespace GFramework.SourceGenerators.Tests.Core; /// public static class MetadataReferenceTestBuilder { + // Reuse the runtime reference set across generator tests to avoid reparsing TRUSTED_PLATFORM_ASSEMBLIES + // for every in-memory compilation. + private static readonly Lazy> CachedRuntimeReferences = + new(CreateRuntimeMetadataReferences); + /// /// 将给定源码编译为内存程序集,并返回可供测试编译消费的元数据引用。 /// @@ -22,7 +26,7 @@ public static class MetadataReferenceTestBuilder params MetadataReference[] additionalReferences) { var syntaxTree = CSharpSyntaxTree.ParseText(source); - var references = GetRuntimeMetadataReferences() + var references = CachedRuntimeReferences.Value .Concat(additionalReferences) .ToImmutableArray(); var compilation = CSharpCompilation.Create( @@ -53,6 +57,11 @@ public static class MetadataReferenceTestBuilder /// /// 当前运行时可信平台程序集对应的元数据引用。 public static ImmutableArray GetRuntimeMetadataReferences() + { + return CachedRuntimeReferences.Value; + } + + private static ImmutableArray CreateRuntimeMetadataReferences() { var trustedPlatformAssemblies = ((string?)AppContext.GetData("TRUSTED_PLATFORM_ASSEMBLIES"))? .Split(Path.PathSeparator, StringSplitOptions.RemoveEmptyEntries) diff --git a/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs b/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs index dc8c9abb..f51dde95 100644 --- a/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs +++ b/GFramework.SourceGenerators.Tests/Cqrs/CqrsHandlerRegistryGeneratorTests.cs @@ -1,7 +1,6 @@ using System.Reflection; using GFramework.SourceGenerators.Cqrs; using GFramework.SourceGenerators.Tests.Core; -using Microsoft.CodeAnalysis.CSharp; namespace GFramework.SourceGenerators.Tests.Cqrs; @@ -1155,7 +1154,11 @@ public class CqrsHandlerRegistryGeneratorTests var compilationErrors = updatedCompilation.GetDiagnostics() .Where(static diagnostic => diagnostic.Severity == DiagnosticSeverity.Error) .ToArray(); - Assert.That(compilationErrors, Is.Empty, string.Join(Environment.NewLine, compilationErrors)); + Assert.That( + compilationErrors, + Is.Empty, + () => + $"编译生成的代码时出现错误:{Environment.NewLine}{string.Join(Environment.NewLine, compilationErrors.Select(static diagnostic => diagnostic.ToString()))}"); var runResult = driver.GetRunResult(); Assert.That(runResult.Results, Has.Length.EqualTo(1));