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

Mih*_*anu 6 .net xunit.net azure-devops asp.net-core

我有一个 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
Run Code Online (Sandbox Code Playgroud)

从已发布的文件夹运行测试时,出现以下错误

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)
Run Code Online (Sandbox Code Playgroud)

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

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

ls *Tests*/*.csproj | xargs -L1 dotnet test --logger:trx
Run Code Online (Sandbox Code Playgroud)

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

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

Nam*_*yev 5

请参阅文章的这一部分https://learn.microsoft.com/en-us/aspnet/core/test/integration-tests?view=aspnetcore-2.2#how-the-test-infrastruct-infers-the-app -内容根路径-1

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

作为运行测试之前的解决方法,我将sln文件从项目复制到“publish”文件夹的父文件夹中。我想创建虚拟 sln 文件也有帮助。我从父目录运行测试命令,如下所示:

dotnet test ./<publish folder>/testProject.dll
Run Code Online (Sandbox Code Playgroud)

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

就我而言,在此之后出现其他错误,显示丢失的目录。我刚刚在父目录中创建了具有确切名称的空目录,它修复了错误。希望这也能对您有所帮助。