XUnit-InvalidOperationException:无法使用应用程序根定位解决方案根



我有一个Web-API.NETCore2.2项目,我正在尝试对它进行集成测试。

我遵循了微软的指南。当从测试运行器和命令行启动测试时,测试通过了,它们应该被正确配置,我可以通过WebApplicationFactory-HTTP客户端调用控制器。我已经通过xunit.runner.json禁用了影子复制。到目前为止还不错。

我正在尝试使用Azure DevOps来部署我的项目,在发布步骤,我添加了一个测试步骤,该步骤接受构建工件,下载它并运行测试。基本上,在本地机器上复制,这将转化为:

dotnet publish testProject.csproj <path_on_disk>
cd <path_on_disk>
vstest.console.exe testProject.dll

当从发布的文件夹运行测试时,我得到以下错误

Failed   wInvoiceIntegrationTests.Controllers.Authentication.AuthenticationControllerTests.AuthenticationController_Register_InputDoesNotRespectsModel_DoesNotRegistersUser(email: "abcd@@.com", password: "Abcdefgh1")
Error Message:
System.InvalidOperationException : Solution root could not be located using application root C:UsersmihaiDesktoppublish.
Stack Trace:
at Microsoft.AspNetCore.TestHost.WebHostBuilderExtensions.UseSolutionRelativeContentRoot(IWebHostBuilder builder, String solutionRelativePath, String applicationBasePath, String solutionName)
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.SetContentRoot(IWebHostBuilder builder)
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.EnsureServer()
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateDefaultClient(DelegatingHandler[] handlers)
at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory`1.CreateClient(WebApplicationFactoryClientOptions options)

我没有需要提供的静态文件,也不想提供,我只是想测试控制器。路径是正确的,这就是测试dll和项目dll所在的位置。

与此同时,我已经设法在构建阶段通过在azure上运行测试

ls *Tests*/*.csproj | xargs -L1 dotnet test --logger:trx

关于如何克服这个问题并从发布文件夹运行测试,有什么想法吗?

编辑:基本上,从输出目录中的命令行和VS测试资源管理器运行测试是可以的,但从发布目录运行是不可以的。

请参阅本文的这一部分https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2#如何在结构中进行测试-应用程序-基础-1

如您所见,WebApplicationFactory类需要推断内容根路径。WebApplicationFactoryWebApplicationFactoryContentRootAttribute中查找路径(如果已定义)。如果找不到该属性,则搜索解决方案(.sln)文件,将包含解决方案文件的文件夹设置为内容根路径。您似乎既没有在测试项目中定义WebApplicationFactoryContentRootAttribute,也没有包含已发布dll的目录的父目录(testProject.dll)包含.sln文件。

在运行测试之前,作为解决方法,我将sln文件从项目复制到"发布"文件夹的父文件夹中。我想仅仅创建一个伪sln文件也会有所帮助。我从父目录运行测试命令,如下所示:

dotnet test ./<publish folder>/testProject.dll

注意。/是复制sln文件的父目录,在您的示例中,"发布文件夹"是"path_on_disk">

在我的情况下,在这个额外的错误出现后,显示丢失的目录。我刚刚在父目录中创建了一个名称准确的空目录,它修复了错误。希望这也能帮助到你。

在使用.NET Core 5.0时,我在集成测试项目中遇到了同样的错误。此解决方案为我解决了问题:https://anthonygiretti.com/2021/04/16/testserver-asp-net-core-5-fix-system-invalidoperationexception-solution-root-could-not-be-located-using-application-root-with-a-custom-startup-file/.

当然,您首先必须将您的项目升级到.NET Core 5.0。

我们遇到了这个问题,花了几个小时拼凑这个问题。事实证明,贾汉·阿夫沙里和纳米格·哈吉耶夫的解决方案都是相关的。我想试着把他们的解决方案拼凑成一个整体。

首先,查看贾汉引用的文章,并确保它与你相关。如果您正在使用。NET 5+,您肯定需要确保您的代码按照文章中概述的方式初始化。

然而,如果这不足以解决你的问题,你需要确保你已经像Namig那样做好了准备。

然而,事实证明,他关于只创建一个伪.sln文件的理论是错误的。这个NET测试体系结构不仅仅是寻找.sln文件的存在。它实际上是使用该文件中的数据来查找项目的路径,该项目在它正在创建的模拟Web服务接口后面包含SUT代码。

我加载并逐步通过后面的代码。NET程序集。它从工作目录开始,一次一个父级地进入目录树,直到找到一个包含一个或多个.sln文件的目录。然后,它遍历这些文件中的每一个,寻找其中包含SUT代码的项目的路径

此外,尽管的性质。NET代码似乎表明.sln文件只需要在您尝试运行的测试项目的目录路径中,它实际上需要在测试项目的直接父目录中。如果它在链的上游,你会遇到另一个错误,它试图引用测试项目,就好像它是解决方案文件下面的一个目录一样。

所以底线是:获得。NET Web服务测试基础结构要工作,创建模拟Web服务的测试项目必须在其父目录中有一个解决方案,该解决方案包含对测试项目和SUT项目的引用以及模拟Web服务背后的代码。

为了确保它能工作,您应该打开包含SUT项目可能依赖的所有项目的任何其他解决方案,运行Clean all,然后关闭该解决方案,在测试项目的父目录中打开该解决方案并从该解决方案运行Build all。这将确保您的生成不会成功,因为它所依赖的其他程序集恰好是预生成的,并且位于测试项目的生成目录中。

一旦该解决方案到位,您应该能够从任何其他您喜欢的解决方案构建和运行您的测试项目。请注意,测试项目代码本身需要父目录中的解决方案来查找和使用SUT代码。

相关内容

最新更新