Bas*_*sie 5 c# integration-testing .net-6.0
我正在尝试向现有的 .net 6.0 项目添加一些集成测试,但不断遇到问题
\n现在,如果我运行测试,它会进入线路await host.RunAsync(CancellationToken.None);
,Program.cs
然后永远挂起,似乎什么也没做
我是否误解了什么?如果不是,我该如何解决这个问题?
\n程序.cs
\npublic /*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
\n1.CreateHost(IHostBuilder builder) DelegatedWebApplicationFactory.CreateHost(IHostBuilder builder) WebApplicationFactory
1.ConfigureHostBuilder(IHostBuilder hostBuilder)\nWebApplicationFactory1.EnsureServer() WebApplicationFactory
1.CreateDefaultClient(DelegatingHandler) [] 处理程序)\nWebApplicationFactory1.CreateDefaultClient(Uri baseAddress, DelegatingHandler[] handlers) WebApplicationFactory
1.CreateClient(WebApplicationFactoryClientOptions 选项)\nWebApplicationFactory`1.CreateClient()\nUnitTest1.Test1Async()\xe2\x80\x89line\xe2\x80\x8935
小智 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