C# &引用;“带代码修复的分析器”;项目模板已损坏

C# &引用;“带代码修复的分析器”;项目模板已损坏,c#,unit-testing,visual-studio-2019,roslyn-code-analysis,C#,Unit Testing,Visual Studio 2019,Roslyn Code Analysis,简短问题:如何在Visual Studio 2019 v16.6.2中使用工作单元测试项目设置roslyn代码分析器项目 几个月前(以及一些VisualStudio更新),我尝试使用“analyzer with code Fix(.NET Standard)”项目模板设置代码分析器项目。它运行良好,正如所有可用的how-to中记录的那样 今天(VS2019 v16.6.2),我想开始一个真正的analyzer项目,但不幸的是,更新后的模板似乎被破坏了,或者发布时有很多未完成的工作正在进行中。(一

简短问题:如何在Visual Studio 2019 v16.6.2中使用工作单元测试项目设置roslyn代码分析器项目

几个月前(以及一些VisualStudio更新),我尝试使用“analyzer with code Fix(.NET Standard)”项目模板设置代码分析器项目。它运行良好,正如所有可用的how-to中记录的那样

今天(VS2019 v16.6.2),我想开始一个真正的analyzer项目,但不幸的是,更新后的模板似乎被破坏了,或者发布时有很多未完成的工作正在进行中。(一个小问题是,包管理器突然似乎无法恢复包,因为它不喜欢使用与analyzer项目相同的程序集名称的vsix项目。)

该模板包含一个单元测试项目。在我试验的早期版本中,这个测试项目包含了大量代码,这些代码就像一个测试基础设施,使开发人员能够轻松地根据真实代码测试分析器

所有这些代码现在似乎都集成在许多特定于语言的nuget包中。但是这些包裹

  • 不再在中托管,而是在中托管
  • 它们都是预发布版本和
  • 它们不包含预期的类/代码
这些是显然需要的包参考(ommitted test framework包):

  • Microsoft.CodeAnalysis.CSharp.Analyzer.Testing.MSTest v1.0.1-beta1.20384.1
  • Microsoft.CodeAnalysis.CSharp.CodeFix.Testing.MSTest v1.0.1-beta1.20384.1
  • Microsoft.CodeAnalysis.CSharp.CodeRefactoring.Testing.MSTest v1.0.1-beta1.20384.1
这是样本单元测试代码:

using System.Threading.Tasks;
using Microsoft.VisualStudio.TestTools.UnitTesting;

using Verify = Microsoft.CodeAnalysis.CSharp.CodeFix.Testing.MSTest.CodeFixVerifier<
    Analyzer1.Analyzer1Analyzer,
    Analyzer1.Analyzer1CodeFixProvider>;

namespace Analyzer1.Test
{
    [TestClass]
    public class UnitTest
    {
        //No diagnostics expected to show up
        [TestMethod]
        public async Task TestMethod1()
        {
            var test = @"";

            await Verify.VerifyCSharpDiagnosticAsync(test);
        }

        //...
说明发现了一个诊断,但没有预期的诊断(这显然是错误的,测试显然需要诊断)


因此,问题仍然存在:如何修复此测试项目?我最近遇到了相同的问题。 感谢您提及更改的nuget URL。 在VS设置中更改后,我可以通过删除
.CodeFix
部分来编译项目

使用Verify=Microsoft.codesanalysis.CSharp.CodeFix.Testing.MSTest.CodeFix验证器<
分析器1.分析器1分析器,
Analyzer1.Analyzer1CodeFixProvider>;
然后,在第一个单元测试中将
verifycsharpdiagnosticsync
替换为
VerifyAnalyzerAsync
,在第二个单元测试中将
verifycsharpfixancync
替换为
verifycodefixancync


不幸的是,其中一个单元测试尚未运行。我将非常感谢您对这个问题的帮助。

我发现了两个带有工作单元测试的存储库:

他们似乎都在使用“手动”方法,项目中包含了助手代码。虽然它们没有阐明捆绑到“beta”Nuget中的项目模板和帮助程序代码的情况,但至少它们提供了一个工作起点

更新:Microsoft已更新其文档;“构建您的第一个分析器和代码修复程序”教程现在在一节中有一个注释,解释了模板中有一个bug,应该在VisualStudioV16.7中修复。该说明还提供了在此之前修复生成项目的步骤

更新2:按照说明中的步骤操作。事实上,对于测试源,它们与AndrewSilver在其回答中提供的相同。得到相同的结果,第二次测试失败。好吧,回到原点

更新3:好的,我想我明白了。简短版本:将以下行添加到分析仪的
Initialize
方法中:

context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
长版本

花了一些时间调试库。罪魁祸首似乎是将您的预期诊断消息声明为排除主题,并将其从预期结果列表中丢弃,从而由于实际(1)和预期(现在为0)诊断之间的不匹配而导致测试失败。即将提交问题,但决定检查是否已经存在类似的问题,事实上,它指向了另一个长线程


顺便说一下,project提供了更多的使用示例。

Microsoft Visual Studio Community 2019 16.8.3的快速更新

经过以下修改后,模板现在可以工作:

  • 使用“Analyzer with Code Fix”初始化新解决方案
  • 在解决方案的根目录中添加一个NuGet.Config文件,即运行以下命令:
    dotnet new nugetconfig
  • 修改NugetConfig文件以添加roslyn analyzers MyGet提要,如下所示:

  • 关闭visual studio,删除解决方案目录中的
    .vs
    文件夹
  • 运行nuget还原并构建它现在应该可以工作了
  • 可以选择在Package manager控制台中运行
    Get Project-all | Update Package
    ,以便将所有包更新为最新版本
roslyn(mstest)软件包已移动到另一个软件包存储库:

您的nuget.config应该如下所示:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- Only specify feed for Arcade SDK (see https://github.com/Microsoft/msbuild/issues/2982) -->
  <packageSources>
    <clear />
    <add key="dotnet5" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json" />
    <add key="dotnet-eng" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json" />
    <add key="dotnet-tools" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" />
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
  <disabledPackageSources>
    <clear />
  </disabledPackageSources>
</configuration>


您是否尝试在Visual Studio安装程序中重新安装“.NET编译器平台SDK”?@XingyuZhao我几个月前安装了这些组件。如果您确信这确实可以工作,我可以卸载并重新安装它们。但是我不明白为什么这会有帮助,因为相关的代码肯定应该在包中,而不是在sdk中,并且没有理由破坏安装。如果安装完美,你确定它会工作吗?roslyn analyzers提要似乎不再存在…似乎现在它位于以下提要之一上:,,我想这是朝着正确方向迈出的一步,但是是的:第二次测试现在失败了,可能是因为它不是csharp代码修复的正确验证器,所以我会等一会儿
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <!-- Only specify feed for Arcade SDK (see https://github.com/Microsoft/msbuild/issues/2982) -->
  <packageSources>
    <clear />
    <add key="dotnet5" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet5/nuget/v3/index.json" />
    <add key="dotnet-eng" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-eng/nuget/v3/index.json" />
    <add key="dotnet-tools" value="https://pkgs.dev.azure.com/dnceng/public/_packaging/dotnet-tools/nuget/v3/index.json" />
    <add key="nuget.org" value="https://api.nuget.org/v3/index.json" />
  </packageSources>
  <disabledPackageSources>
    <clear />
  </disabledPackageSources>
</configuration>