为什么我的 WebApplicationFactory 在超时之前挂起 5 分钟?

Bas*_*sie 5 c# integration-testing .net-6.0

我正在尝试向现有的 .net 6.0 项目添加一些集成测试,但不断遇到问题

\n

现在,如果我运行测试,它会进入线路await host.RunAsync(CancellationToken.None);Program.cs然后永远挂起,似乎什么也没做

\n

我是否误解了什么?如果不是,我该如何解决这个问题?

\n

程序.cs

\n
public /*static*/ class Program\n{\n    public static async Task Main(string[] args)\n    {\n        var host = BuildWebHost(args);\n\n        await host.InitialiseAsync(CancellationToken.None);\n\n        await host.SeedAsync(CancellationToken.None);\n\n        await host.RunAsync(CancellationToken.None); // hangs here\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n

测试.cs

\n
[Fact]\npublic void Test1Async()\n{\n    using (var application = new WebApplicationFactory<Program>()\n        .WithWebHostBuilder(builder =>\n        {\n            builder.ConfigureServices(services =>\n            {\n                // set up servises\n            });\n        }))\n    {\n        var c = application.CreateClient(); // hangs here\n    }\n}\n
Run Code Online (Sandbox Code Playgroud)\n
\n

它最终会超时并给我这个错误

\n
\n

消息:\xe2\x80\x89\nSystem.InvalidOperationException:在 00:05:00 之后等待构建 IHost 的入口点超时。可以使用“DOTNET_HOST_FACTORY_RESOLVER_DEFAULT_TIMEOUT_IN_SECONDS”环境变量修改此超时。

\n
\n
\n

堆栈跟踪:\xe2\x80\x89\nHostingListener.CreateHost()\n<>c__DisplayClass10_0.b__0(String[] args)\nDeferredHostBuilder.Build()\nWebApplicationFactory 1.CreateHost(IHostBuilder builder) DelegatedWebApplicationFactory.CreateHost(IHostBuilder builder) WebApplicationFactory1.ConfigureHostBuilder(IHostBuilder hostBuilder)\nWebApplicationFactory 1.EnsureServer() WebApplicationFactory1.CreateDefaultClient(DelegatingHandler) [] 处理程序)\nWebApplicationFactory 1.CreateDefaultClient(Uri baseAddress, DelegatingHandler[] handlers) WebApplicationFactory1.CreateClient(WebApplicationFactoryClientOptions 选项)\nWebApplicationFactory`1.CreateClient()\nUnitTest1.Test1Async()\xe2\x80\x89line\xe2\x80\x8935

\n
\n

小智 2

即使您没有共享BuildWebHost()方法的代码,我也认为它是这样的public static IWebHostBuilder BuildWebHost(string[] args)

如果是这样,只需将此方法重命名为CreateWebHostBuilder. 方法的名称很重要,因为WebApplicationFactory内部正在寻找它。

直接来自构造函数的摘要:

/// The <see cref="WebApplicationFactory{TEntryPoint}"/> will find the entry point class of <typeparamref name="TEntryPoint"/>
/// assembly and initialize the application by calling <c>IWebHostBuilder CreateWebHostBuilder(string [] args)</c>
/// on <typeparamref name="TEntryPoint"/>.
Run Code Online (Sandbox Code Playgroud)

来源: https: //github.com/dotnet/aspnetcore/blob/main/src/Mvc/Mvc.Testing/src/WebApplicationFactory.cs#L24