XUnit-InvalidOperationException:无法使用应用程序根目录找到解决方案根目录

时间:2019-02-02 17:00:18

标签: .net asp.net-core azure-devops xunit.net

我有一个Web-API .NET Core 2.2项目,我正在尝试对其进行集成测试。

我遵循了Microsoft中的指南。从测试运行程序和命令行启动测试时,测试通过了,应该正确配置它们,我能够通过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:\Users\mihai\Desktop\publish\.
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

关于如何克服这一点并从publish文件夹运行测试的任何想法?

编辑:基本上可以从输出目录中的命令行以及VS测试浏览器运行测试,但是不能从发布目录运行。

2 个答案:

答案 0 :(得分:0)

请参阅文章https://docs.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2#how-the-test-infrastructure-infers-the-app-content-root-path-1的这一部分

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

作为解决方案,在运行测试之前,我将项目中的 sln 文件复制到了“发布”文件夹的父文件夹中。我猜只是创建虚拟sln文件也可以提供帮助。我从父目录运行我的测试命令,如下所示:

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

注意./是在其中复制sln文件的父目录,在示例中,“发布文件夹”是“ path_on_disk”

在我的情况下,出现此附加错误后,显示目录丢失。我刚刚在父目录中创建了具有准确名称的空目录,并且它修复了错误。希望这对您也有帮助。

答案 1 :(得分:0)

我在使用 .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。