出现此问题的原因是BackgroundService阻塞了应用程序的启动,导致WebApplicationFactory.CreateClient无法完成创建。解决此问题的方法是,在测试项目中手动启动BackgroundService,使其在应用程序启动之前完成初始化。
以下示例演示了如何在集成测试中手动启动BackgroundService:
public class MyApplicationFactory : WebApplicationFactory
{
protected override void ConfigureWebHost(IWebHostBuilder builder)
{
builder.ConfigureServices(services =>
{
services.AddHostedService();
});
}
}
public class MyBackgroundService : BackgroundService
{
protected override async Task ExecuteAsync(CancellationToken stoppingToken)
{
// 启动BackgroundService的代码
await Task.CompletedTask;
}
}
public class MyIntegrationTest
{
private readonly HttpClient _client;
public MyIntegrationTest()
{
var appFactory = new MyApplicationFactory();
appFactory.Server.AllowSynchronousIO = true; // 启用同步 IO。
var server = appFactory.Server;
server.StartAsync().Wait(); // 手动启动 BackgroundService。
_client = appFactory.CreateClient();
}
[Fact]
public async Task Test()
{
// 在此处执行测试...
}
}
在此示例中,我们手动启动了BackgroundService,以确保应用程序启动时它已经完成初始化。这样可以避免在测试期间出现阻塞问题。