在 .NET 5 中生成 Microsoft Fakes 程序集

Generate Microsoft Fakes assemblies in .NET 5

我正在努力将 .NET 4.x 代码迁移到 .NET 5。单元测试项目广泛使用 Microsoft Fakes,它最近获得了 .NET 5 的正式实施 Visual Studio 2019 年。我在本地进行了构建和单元测试 运行ning,并开始在 AzureDevOps (On Prem) 中为项目设置 CI/CD 管道。我在本地和构建代理服务器上安装了 VS 2019 Enterprise

我的构建管道由 dotnet restore 和以下选项组成
-s https://api.nuget.org/v3/index.json -s "C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\"

我已将 "C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\" 作为来源,因为我确定 Microsoft fakes 是本地 nuget 包,由 VS 2019 企业版安装在这个特定目录中。

还原后有两个 dotnet build 命令 运行,具有以下选项
--no-restore --configuration $(BuildConfiguration) /p:VersionPrefix=$(Build.BuildNumber) /p:AssemblyVersion=$(Build.BuildNumber) /p:GenerateProjectSpecificOutputFolder=True

我正在使用 2 个 dotnet build 命令,因为我注意到我使用一个命令设置任务的方式导致测试项目在他们正在测试的项目之前构建并且不想要花时间寻找 glob 模式以正确设置构建顺序。 (或者我误读了日志,无论哪种方式我在调试时为了清晰起见将其拆分)

当测试项目的 dotnet build 命令 运行 时,它失败并显示消息 The type or namespace name 'Fakes' does not exist in the namespace (are you missing an assembly reference?)。这告诉我,我在测试项目中拥有的 Fakes 程序集不是由 dotnet build 生成的(或者至少是我当前拥有的选项)。我需要做什么才能生成 Fakes 程序集?

杂项:我在 azure dev ops 中使用 1.x 版本的 .NET CORE 任务。

更新 1

根据另一个论坛的建议,运行在我的本地工作站上执行相关的 dotnet 命令也产生了同样的错误。应另一人的要求,这是一个细分

dotnet build .sln --configuration Debug /p:GenerateProjectSpecificOutputFolder=True 在本地工作,但我意识到我仍然拥有上次在 Visual Studio 中构建 sln 时的假程序集。于是又试了

dotnet clean dotnet build .sln --configuration Debug /p:GenerateProjectSpecificOutputFolder=TrueFakes does not exist 错误而出错。然后我尝试了

dotnet clean dotnet build Main.csproj --configuration Debug /p:GenerateProjectSpecificOutputFolder=True dotnet build Main.Tests.csproj --configuration Debug /p:GenerateProjectSpecificOutputFolder=True

Main.csproj 的构建成功,而 Main.Tests.csproj 的构建出错 Fakes does not exist

dotnet clean dotnet restore dotnet build .sln --configuration Debug --no-restore /p:GenerateProjectSpecificOutputFolder=True 还给出 Fakes does not exist 错误

根据 dotnet nuget list source 我从以下来源提取软件包

1.  nuget.org [Enabled]
    https://api.nuget.org/v3/index.json
2.  <Internal Nuget Feed 1> [Enabled]
      <Details Redacted>
3.  DevExpress 19.1 Local [Enabled]
  C:\Program Files (x86)\DevExpress 19.1\Components\System\Components\Packages
4.  Microsoft Visual Studio Offline Packages [Enabled]
    C:\Program Files (x86)\Microsoft SDKs\NuGetPackages\
5.  <Internal Nuget Feed 2> [Enabled]
     <Details Redacted>

在重新阅读了一些关于假货的 MS 文档后,我不得不承认,我终于找到了问题的主要原因。根据 this pageUsing Microsoft Fakes in the CI 的部分中,在第一段中说

Since Microsoft Fakes requires Visual Studio Enterprise, the generation of Fakes Assemblies requires that you build your project using Visual Studio Build Task.

我还发现这也适用于 运行使用 Microsoft Fakes 的单元测试。您不能在管道中使用 dotnet test,而是需要使用 Visual Studio Test 任务。

这两项任务都必须使用 Visual Studio 2019 年或更高版本。这对我来说很复杂,因为我们使用的是 TFS 2017,它不会在这些管道任务中检测到 Visual Studio 2019,即使您选择 Latest 作为 Visual Studio 版本。

为了解决这个问题,我不得不将 Visual Studio Build 更改为使用 MS Build 任务以指向 2019 安装的 MS 版本。对于单元测试,我必须编写自定义 powershell 脚本来调用 vstest.console.exe 的正确版本。 Visual Studio Test 任务的更高版本添加了一个字段来更改此路径,因此您不必使用 PowerShell 脚本。

如果您需要帮助找到 msbuild.exe 和 vstest.console.exe 的路径,您可以在构建服务器上打开 Visual Studio 2019 开发人员提示和 运行 where msbuildwhere vstest.console.exe 获取您需要在管道中使用的路径。

对于发布,如果添加 --no-build 参数,您仍然可以使用 dotnet publish。如果您使用 **/*.csproj 之类的通配符模式,您还需要从发布命令中排除模式为 !**/f.csproj 的项目。 f.csproj 文件来自构建期间的假冒生成,如果发布任务发现它们包含类似于

的消息,则会出错

Could not copy the file "obj\Debug\net5.0\Fakes\sdc\b\net5.0\System.Data.Common.5.0.0.0.Fakes.deps.json" because it was not found. [obj\Debug\net5.0\Fakes\sdc\f.csproj]