Dotnet 6 集成测试缺少 Deps 文件

Per*_*nce 20 .net c# xunit asp.net-core

在开始之前,我已经尝试了以下所有建议,但均无效:

集成测试 ASP.NET Core 与 .NET Framework - 找不到 deps.json

https://zimmergren.net/unable-to-find-deps-json-dotnet-azure-devops/


所以我试图为 dotnet 6 编写一些集成测试。但是,我WebApplicationFactory抛出以下错误:

System.InvalidOperationException:找不到'/repos/subscription-info-api/tests/SubscriptionInfoApi.Tests.Integration/bin/Debug/net6.0/...

System.InvalidOperationException 找不到“/repos/subscription-info-api/tests/SubscriptionInfoApi.Tests.Integration/bin/Debug/net6.0/testhost.deps.json”。该文件是功能测试正常运行所必需的。您的源项目 bin 文件夹中应该有该文件的副本。如果情况并非如此,请确保项目文件上的属性 PreserveCompilationContext 设置为 true。例如“真实”。为了使功能测试正常工作,它们需要从构建输出文件夹运行,或者必须将应用程序输出目录中的 testhost.deps.json 文件复制到运行测试的文件夹中。导致此错误的一个常见原因是在测试运行时启用了卷影复制。在 Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory 1.EnsureDepsFile() at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory1.EnsureServer() 在 Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory 1.CreateDefaultClient(DelegatingHandler[] handlers) at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory1.CreateDefaultClient(Uri baseAddress,DelegatingHandler[] 处理程序) 在 Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory 1.CreateClient(WebApplicationFactoryClientOptions options) at Microsoft.AspNetCore.Mvc.Testing.WebApplicationFactory1.CreateClient () 位于 /repos/subscription-info-api/tests/SubscriptionInfoApi.Tests.Integration/UnitTest1.cs 中的 SubscriptionInfoApi.Tests.Integration.UnitTest1.Test1():SubscriptionInfoApi.Tests.Integration.UnitTest1.Test1() 第 14 行在 /repos/subscription-info-api/tests/SubscriptionInfoApi.Tests.Integration/UnitTest1.cs:第 16 行 Xunit.Sdk.TestInvoker 1.<>c__DisplayClass48_0.<<InvokeTestMethodAsync>b__1>d.MoveNext() in /_/src/xunit.execution/Sdk/Frameworks/Runners/TestInvoker.cs:line 264 --- End of stack trace from previous location --- at Xunit.Sdk.ExecutionTimer.AggregateAsync(Func1 asyncAction) 在 / /src/xunit.execution/Sdk/Frameworks/ExecutionTimer.cs 中: / /src/xunit.core/Sdk/ExceptionAggregator.cs 中的 Xunit.Sdk.ExceptionAggregator.RunAsync(Func`1 code) 第 48 行:第 90 行

我的实际测试代码非常简单:

   [Fact]
    public async Task Test1()
    {
        await using var app    = new WebApplicationFactory<Program>();
        using var client = app.CreateClient();
        var       res    = await (await client.GetAsync("/alive-test")).Content.ReadAsStringAsync();
        Assert.Equal("Alive!", res);
    }
Run Code Online (Sandbox Code Playgroud)

根据建议,我已确保Microsoft.AspNetCore.Mvc.Testing -> 6.0.0在我的集成测试项目中直接引用。我还尝试了对建议的文件进行各种调整.csproj,但似乎没有任何效果。

我被困在试图进一步调试这个问题上,有什么想法吗?

Pma*_*Ace 60

您可能在测试文件中为 Program 指定了错误的命名空间(就像我一样)。

我必须在 Program.cs 文件末尾(最后一行)添加以下内容,以使其对需要它的测试项目可见:

public partial class Program { }
Run Code Online (Sandbox Code Playgroud)

可以在此处找到示例:最小 api 测试示例

  • 该死的……好地方。是的,它正在查看扩展中的一些测试程序类。谢谢 :) (3认同)
  • 这让我经历了两次,时间过去了,我忘记了我需要做什么。你的帖子现在救了我两次。这并不是说 Program 是私有的,而是因为它从 Microsoft 测试框架中引入了 Program。(啊,这和@oneManArmin 遇到的问题是一样的) (2认同)
  • 这绝对是我的问题。 (2认同)

rTE*_*ECH 17

我也遇到了同样的问题,尽管原因完全不同。

我正在使用 .net 6,但我故意选择使用实际具有文件的实现Program.cs当我从官方 MS 集成测试指南复制代码时,我让 VS 引入所有依赖项。用于解决的依赖项Program.cs不是我自己的(为了这个答案而使用PersonalSite ),而是 MS 自己的实现之一:

在此输入图像描述

当然,我犯了一个小错误,但也许我可以帮助别人。

对于那些真正需要部分类实现技巧的人,我链接的 MS 集成测试指南列出了做到这一点的指南。