Я создал генератор исходного кода С# Roslyn и тест, генератор работает, но тест не находит тот же источник.C#

Место общения программистов C#
Ответить Пред. темаСлед. тема
Anonymous
 Я создал генератор исходного кода С# Roslyn и тест, генератор работает, но тест не находит тот же источник.

Сообщение Anonymous »

Я создал простой генератор исходного кода, который отлично работает

Код: Выделить всё

using Microsoft.CodeAnalysis;
using Microsoft.CodeAnalysis.CSharp;
using Microsoft.CodeAnalysis.CSharp.Syntax;
using Microsoft.CodeAnalysis.Text;
using System.Text;

namespace TestGenerator;

[Generator]
public class TestGenerator : IIncrementalGenerator
{

public void Initialize(IncrementalGeneratorInitializationContext context)
{
// Register a syntax receiver to collect information during the initial parsing phase
var classDeclarations = context.SyntaxProvider.ForAttributeWithMetadataName(
"TestGenerator.TestSourceGeneratorAttribute",

predicate: static (s, _) => (s is ClassDeclarationSyntax || s is StructDeclarationSyntax) && s is TypeDeclarationSyntax type && type.Modifiers.Any(SyntaxKind.PartialKeyword),
transform: static (ctx, _) =>
{
if (ctx.TargetNode is TypeDeclarationSyntax typeDeclarationSyntax)
{
return typeDeclarationSyntax.Identifier.ToString();
}
return null;
})
.Where(static m => m is not null);
var compilationAndClasses = classDeclarations.Collect();

// Set up the generation phase
context.RegisterSourceOutput(compilationAndClasses, static (spc, classes) =>
{
foreach (var typeDefinition in classes)
{
// Add the generated source to the output
spc.AddSource($"{typeDefinition}.g.cs",
SourceText.From(GetSource(typeDefinition), Encoding.UTF8));
}
});
}

private static string GetSource(string source)
{
return $"""
//
#nullable enable
using System;

/// {source}
""";
}
}
Добавлен класс в тестовый проект

Код: Выделить всё

namespace TestGenerator.Test
{
[TestSourceGenerator]
public partial class TestClassGenerated
{

}
}
и исходный код сгенерирован нормально

Код: Выделить всё

//
#nullable enable
using System;

/// TestClassGenerated
затем я создал модульный тест

Код: Выделить всё

using Microsoft.CodeAnalysis.CSharp.Testing;
using Microsoft.CodeAnalysis.Testing;
using Microsoft.VisualStudio.TestTools.UnitTesting;
using System.Threading.Tasks;

namespace TestGenerator.Test;

[TestClass]
public class TestGeneratorUnitTest
{
[TestMethod]
public async Task Test123()
{
// Arrange
var source = """
using System;

namespace TestGenerator.Test
{
[TestSourceGenerator]
public partial class MyClass
{

}
}
""";

var expectedGeneratedCode = @"
//
#nullable enable
using System;

/// MyClass
";

var test = new CSharpSourceGeneratorTest
{
TestState =
{
Sources = { source },
GeneratedSources =
{
(typeof(TestGenerator), "MyClass.g.cs", expectedGeneratedCode)
}
}
};

// Act & Assert
await test.RunAsync();
}
}
и для теста он не фильтрует класс, предикат истинен, но он не входит в преобразование
Я создал репродукция, которую нужно добавить сюда
https://github.com/luizfbicalho/TestSourceGenerator
Я ожидаю, что тест сгенерирует файл MyClass

Подробнее здесь: https://stackoverflow.com/questions/787 ... -works-but
Реклама
Ответить Пред. темаСлед. тема

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

  • Похожие темы
    Ответы
    Просмотры
    Последнее сообщение

Вернуться в «C#»