【发布时间】:2022-07-08 17:21:00
【问题描述】:
我正在使用 Microsoft 模板编写一个简单的代码分析器和修复器。我想修复 else 语句中的嵌套 if 语句。示例:
using System;
using System.Runtime.InteropServices;
namespace ExamApp
{
public class Program
{
static void Main()
{
if (Condition())
{
Action();
}
else
{
if (Condition())
{
Action();
}
}
}
static bool Condition()
{
return false;
}
static void Action() { }
}
}
应该转换成
using System;
using System.Runtime.InteropServices;
namespace ExamApp
{
public class Program
{
static void Main()
{
if (Condition())
{
Action();
}
else if (Condition())
{
Action();
}
}
static bool Condition()
{
return false;
}
static void Action() { }
}
}
我运行 Analyzer.Vsix 打开另一个 VS 窗口,打开一些沙盒项目,从第一个示例中编写代码。 VS向我展示了在正确的位置警告,建议修复它并正确修复它。我决定写一个这样的测试:
//Diagnostic and CodeFix both triggered and checked for
[TestMethod]
public async Task TestMethod2()
{
var test = @"
using System;
using System.Runtime.InteropServices;
namespace ExamApp
{
public class Program
{
static void Main()
{
if (Condition())
{
Action();
}
else
{
if (Condition())
{
Action();
}
}
}
static bool Condition()
{
return false;
}
static void Action() { }
}
}";
var fixtest = @"
using System;
using System.Runtime.InteropServices;
namespace ExamApp
{
public class Program
{
static void Main()
{
if (Condition())
{
Action();
}
else if (Condition())
{
Action();
}
}
static bool Condition()
{
return false;
}
static void Action() { }
}
}";
var expected = VerifyCS.Diagnostic("AnalyzerTemplate").WithSpan(17, 13, 17, 17).WithArguments("IfKeyword");
await VerifyCS.VerifyCodeFixAsync(test,expected, fixtest);
}
但是出了点问题,这是输出:
Assert.Fail failed. Context: Iterative code fix application
content of '/0/Test0.cs' did not match. Diff shown with expected as baseline:
using System;
using System.Runtime.InteropServices;
namespace ExamApp
{
public class Program
{
static void Main()
{
if (Condition())
{
Action();
}
else if (Condition())
{
Action();
}
}
static bool Condition()
{
return false;
}
static void Action() { }
}
}
at Microsoft.CodeAnalysis.Testing.Verifiers.MSTestVerifier.Fail(String message) in /_/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Testing.Verifiers.MSTest/MSTestVerifier.cs:line 78
at Microsoft.CodeAnalysis.Testing.IVerifierExtensions.EqualOrDiff(IVerifier verifier, String expected, String actual, String message) in /_/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/Extensions/IVerifierExtensions.cs:line 56
at Microsoft.CodeAnalysis.Testing.CodeFixTest`1.VerifyFixAsync(String language, ImmutableArray`1 analyzers, ImmutableArray`1 codeFixProviders, SolutionState oldState, SolutionState newState, Int32 numberOfIterations, Func`10 getFixedProject, IVerifier verifier, CancellationToken cancellationToken) in /_/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CodeFix.Testing/CodeFixTest`1.cs:line 415
at Microsoft.CodeAnalysis.Testing.CodeFixTest`1.VerifyFixAsync(SolutionState testState, SolutionState fixedState, SolutionState batchFixedState, IVerifier verifier, CancellationToken cancellationToken) in /_/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CodeFix.Testing/CodeFixTest`1.cs:line 372
at Microsoft.CodeAnalysis.Testing.CodeFixTest`1.RunImplAsync(CancellationToken cancellationToken) in /_/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.CodeFix.Testing/CodeFixTest`1.cs:line 248
at Microsoft.CodeAnalysis.Testing.AnalyzerTest`1.RunAsync(CancellationToken cancellationToken) in /_/src/Microsoft.CodeAnalysis.Testing/Microsoft.CodeAnalysis.Analyzer.Testing/AnalyzerTest`1.cs:line 180
at AnalyzerTemplate.Test.CSharpCodeFixVerifier`2.VerifyCodeFixAsync(String source, DiagnosticResult[] expected, String fixedSource) in C:\JetBrains\C#\AnalyzerTemplate-master\AnalyzerTemplate\AnalyzerTemplate.Test\Verifiers\CSharpCodeFixVerifier`2.cs:line 58
at AnalyzerTemplate.Test.CSharpCodeFixVerifier`2.VerifyCodeFixAsync(String source, DiagnosticResult expected, String fixedSource) in C:\JetBrains\C#\AnalyzerTemplate-master\AnalyzerTemplate\AnalyzerTemplate.Test\Verifiers\CSharpCodeFixVerifier`2.cs:line 46
at AnalyzerTemplate.Test.AnalyzerTemplateUnitTest.TestMethod2() in C:\JetBrains\C#\AnalyzerTemplate-master\AnalyzerTemplate\AnalyzerTemplate.Test\AnalyzerTemplateUnitTests.cs:line 89
at Microsoft.VisualStudio.TestPlatform.MSTestAdapter.PlatformServices.ThreadOperations.ExecuteWithAbortSafety(Action action)
我不明白,为什么没有差异(通常用 +/- 标记它们)以及如何使我的测试正常工作
【问题讨论】:
-
您是否能够加载输出
/0/Test0.cs文件并将其与您的预期输出进行比较? (另外,您可能希望使用const而不是var)。 -
@Dai,我在哪里可以找到
/0/Test0.cs' file? There is no such file in project/solution. Changingvar` 到const string没有效果,遇到同样的问题 -
使用 VoidtoolsEverytihng 之类的工具查找它,或查看解决方案的
TestResults目录或项目的obj目录。 -
即使使用该工具我也找不到 Test0.cs... :(.user-images.githubusercontent.com/37481171/…
标签: c# roslyn roslyn-code-analysis