gpt4 book ai didi

c# - "Analyzer with Code Fix"项目模板已损坏

转载 作者:行者123 更新时间:2023-12-03 15:39:13 35 4
gpt4 key购买 nike

简短问题:如何在Visual Studio 2019 v16.6.2中使用工作单元测试项目设置roslyn代码分析器项目?
几个月前(和一些Visual Studio更新),我尝试使用“带有代码修复(.NET Standard)的分析器”项目模板来设置代码分析器项目。它运行良好,并且在所有可用的方法文档中都有记录。
今天(VS2019 v16.6.2),我想启动一个真正的分析器项目,但是不幸的是,更新的模板似乎已损坏或要发布,并且还有许多未完成的工作在进行中。 (一个小问题是软件包管理器突然似乎无法还原软件包,因为它不喜欢使用与分析器项目相同的程序集名称的vsix项目。)
该模板包含一个单元测试项目。在我试用的早期版本中,该测试项目包含许多代码,它们的行为就像一个测试基础结构,使开发人员可以轻松地针对真实代码对分析器进行测试。
现在,所有这些代码似乎都集成在许多特定于语言的nuget包中。但是这些包

  • 不再托管在https://dotnet.myget.org/F/roslyn/api/v3/index.json中,而是托管在https://dotnet.myget.org/F/roslyn-analyzers/api/v3/index.json中,而不是
  • 它们都是预发行版本,而
  • ,它们不包含预期的类/代码

  • 这些是显然需要的程序包引用(省略了测试框架程序包):
  • 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);
    }

    //...
    我设法通过添加正确的源URL来安装软件包,并将所有引用的软件包更新为最新(预发行)版本。但是,无论我尝试了什么,都无法编译此模板代码,因为命名空间

    Microsoft.CodeAnalysis.CSharp.CodeFix


    (用于 Verify的别名声明中) 找不到。对该 namespace 进行谷歌搜索仅使我回到了 Microsoft.CodeAnalysis.CSharp.CodeFix.Testing.*软件包的myget.org网站。

    那么,我该怎么做才能为我的代码分析器项目设置一个可工作的单元测试(最好是mstest)项目?我也可以使用直接包含在项目中的所有帮助程序代码的“旧”版本,而不使用未完成的nuget包。

    更新:实现 AndrewSilvers's answer后,模板的第二次测试失败:
        [TestMethod]
    public async Task TestMethod2()
    {
    var test = @"
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Diagnostics;

    namespace ConsoleApplication1
    {
    class TypeName
    {
    }
    }";

    var fixtest = @"
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Text;
    using System.Threading.Tasks;
    using System.Diagnostics;

    namespace ConsoleApplication1
    {
    class TYPENAME
    {
    }
    }";

    var expected = Verify.Diagnostic("Analyzer1").WithLocation(11, 15).WithArguments("TypeName");
    await Verify.VerifyCodeFixAsync(test, expected, fixtest);
    }
    }
    指出发现了一个诊断程序 ,但没有预期的(显然是错误的,该测试显然期望诊断程序)。
    因此, 问题仍然存在: 如何修复此测试项目?

    最佳答案

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

  • https://github.com/dotnet/samples/tree/master/csharp/roslyn-sdk/Tutorials/MakeConst
  • https://github.com/dotnet/roslyn/tree/master/src/Analyzers/CSharp

  • 他们似乎都在使用“手动”方法,并在项目中包含了辅助代码。尽管他们对捆绑到“beta”组件中的项目模板和帮助程序代码没有任何了解,但至少它们提供了一个可行的起点。
    更新:Microsoft已更新其文档。现在,“构建您的第一个分析器和代码修复”教程的 Prerequisites部分中有一条注释,解释了模板中的错误,应在Visual Studio v16.7中修复该错误。该说明还提供了在此之前修复生成的项目的步骤。
    更新2:遵循注释中的步骤。实际上,对于测试源,它们与AndrewSilver在他的答案中提供的相同。得到相同的结果,第二次测试失败。哦,好,回到第一个方框。
    更新3:好的,我想我明白了。简短版本:将以下行添加到分析仪的 Initialize方法中:
    context.ConfigureGeneratedCodeAnalysis(GeneratedCodeAnalysisFlags.None);
    长版
    花了一些时间调试该库。罪魁祸首似乎是 this line,它将声明您的预期诊断消息为排除对象,并从预期结果列表中将其丢弃,因此由于实际(1)诊断与预期(现在为0)诊断不匹配而导致测试失败。即将提出问题,但决定检查是否已经存在类似的东西。的确 It does,它指向另一个带有 this solution的冗长线程。
    顺便说一下,项目的 README file提供了更多使用示例。

    关于c# - "Analyzer with Code Fix"项目模板已损坏,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62638455/

    35 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com