如何对自己的自定义分析器和代码修复提供程序进行单元测试?
我坐在电脑前,手放在键盘上,但不知道该打什么。
如何对自己的自定义分析器和代码修复提供程序进行单元测试?
我坐在电脑前,手放在键盘上,但不知道该打什么。
请仔细阅读本文的其余部分,我将概述这些课程正在做什么以及它们的关键方面。之后,您可以根据自己的需求创建自己的实现。
删除所有这些类,改用我基于这些帮助程序创建的RoslynTester NuGet软件包。这将使您能够立即开始使用RC2版本的Roslyn并更轻松地进行更新。有关更多信息,请查看我的博客或Github页面。
辅助工具背后的思想很简单:给定一个或多个表示类文件的字符串和一个或多个表示预期诊断结果的对象,创建一个内存中的项目,并执行分析器。
对于CodeFix提供程序,您还可以指定转换后代码的外观。
这是一个示例测试,当您拥有一个异步方法其名称不以"Async"结尾时,会显示警告并提供CodeFix以更改名称。
[TestMethod]
public void AsyncMethodWithoutAsyncSuffixAnalyzer_WithAsyncKeywordAndNoSuffix_InvokesWarning()
{
var original = @"
using System;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class MyClass
{
async Task Method()
{
}
}
}";
var result = @"
using System;
using System.Text;
using System.Threading.Tasks;
namespace ConsoleApplication1
{
class MyClass
{
async Task MethodAsync()
{
}
}
}";
var expectedDiagnostic = new DiagnosticResult
{
Id = AsyncMethodWithoutAsyncSuffixAnalyzer.DiagnosticId,
Message = string.Format(AsyncMethodWithoutAsyncSuffixAnalyzer.Message, "Method"),
Severity = EmptyArgumentExceptionAnalyzer.Severity,
Locations =
new[]
{
new DiagnosticResultLocation("Test0.cs", 10, 13)
}
};
VerifyCSharpDiagnostic(original, expectedDiagnostic);
VerifyCSharpFix(original, result);
}
正如您所看到的,设置非常简单:您确定有缺陷的代码的外观,指定它应该如何显示,并指示应显示的警告属性。
第一步是创建内存中的项目。这包括以下几个步骤:
new AdhocWorkspace()
).CurrentSolution.AddProject()
).AddMetadataReferences()
)solution.AddDocument()
)在这里,我们将使用刚刚创建的文档。这两行是最重要的:
var compilation = project.GetCompilationAsync().Result;
var diagnostics = compilation.WithAnalyzers(ImmutableArray.Create(analyzer))
.GetAnalyzerDiagnosticsAsync()
.Result;
此时,您已经拥有了所需的一切:实际结果和预期结果。现在只需要验证这两个集合是否匹配。
这与诊断过程大致相同,但增加了一些内容。
CodeFixContext
var actions = new List<CodeAction>();
var context = new CodeFixContext(document, analyzerDiagnostics[0],
(a, d) => actions.Add(a), CancellationToken.None);
codeFixProvider.RegisterCodeFixesAsync(context).Wait();
var operations = codeAction.GetOperationsAsync(CancellationToken.None).Result;
var solution = operations.OfType<ApplyChangesOperation>().Single().ChangedSolution;
您可以在此项目中找到使用RoslynTestKit构建的示例测试https://github.com/smartanalyzers/MultithreadingAnalyzer/tree/master/src/MultithreadingAnalyzer.Test
/configuration/packageSources
并添加:<add key="roslyn-analyzers" value="https://dotnet.myget.org/F/roslyn-analyzers/api/v3/index.json" />
dotnet new nugetconfig
创建一个新的。
在使用NuGet包管理器添加/更新这些包时,您可能需要包括预发布版本。
这些包支持测试DiagnosticAnalyzer、CodeFixProvider和CodeRefactoringProvider,
使用C#或Visual Basic编写,
通过添加特定的PackageReference
,
可以通过MSTest V2、NUnit或xUnit.net进行测试:
Microsoft.CodeAnalysis.[CSharp|VisualBasic].[Analyzer|CodeFix|CodeRefactoring].Testing.[MSTest|NUnit|XUnit]
目前不支持测试CompletionProvider。
警告: Visual Studio 16.6 模板存在错误,无法编译。 请参考文档获取正确的名称空间和方法名称。