【问题标题】:BackgroundService is blocking completion of WebApplicationFactory.CreateClient in integration testBackgroundService阻止完成WebApplicationFactory.createClient在集成测试中
【发布时间】:2022-01-25 06:42:01
【问题描述】:

我们正在使用 SpecFlow 为 .net-core-3.1 WebApplication 编写集成测试。我们的网络应用程序包含一个用于订阅 Kafka 的 BackgroundService。此 BackgroundService 的存在会阻止 WebApplicationFactory.CreateClient 方法完成。我读到有人在资源有限的测试环境中遇到类似问题,但这种情况在现代笔记本电脑上发生在我们身上。

我们的测试类的构造函数:

public PocServiceSteps(ScenarioContext context)
{
    _context = context;

    _factory = new WebApplicationFactory<Startup>()
    .WithWebHostBuilder(builder => builder.ConfigureServices(services =>
    {
        // setup any required services changes here
    }));

    // this method never completes
    _client = _factory.CreateClient(
        new WebApplicationFactoryClientOptions
        {
            BaseAddress = new Uri($"http://localhost:5000/")
        }
    );
}

我们尝试过的一件事是根据 https://www.strathweb.com/2021/05/the-curious-case-of-asp-net-core-integration-test-deadlock/ 覆盖 WebApplicationFactory,但这并不能解决问题:

private class AsyncFriendlyWebApplicationFactory<T> : WebApplicationFactory<T> where T : class
{
    protected override IHost CreateHost(IHostBuilder builder)
    {
        var host = builder.Build();
        Task.Run(() => host.StartAsync()).GetAwaiter().GetResult();
        return host;
    }
}

【问题讨论】:

  • edit 您的问题包括当您说“此BackgroundService 的存在阻止WebApplicationFactory.CreateClient 方法完成。”时的含义。您是否遇到异常?如果是这样,错误消息和堆栈跟踪是什么。如果您没有收到错误,那么行为究竟是什么?该方法是否只是挂起并且永不返回?

标签: c# integration-testing asp.net-core-3.1 specflow


【解决方案1】:

如果您的测试不需要后台服务,您可以将其删除:

var factory = new WebApplicationFactory<Startup>()
    .WithWebHostBuilder(builder =>
        builder.ConfigureTestServices(s =>
        {
            var descriptor = s.SingleOrDefault(
                d => d.ImplementationType ==
                     typeof(MyBackgroundService));

            s.Remove(descriptor);
        })
    );

如果您像这样在 Startup.cs 中注册您的服务:

builder.Services.AddHostedService<MyBackgroundService>();

【讨论】:

    猜你喜欢
    • 2021-04-15
    • 2011-09-30
    • 1970-01-01
    • 1970-01-01
    • 2022-06-15
    • 2022-12-21
    • 2019-01-21
    • 1970-01-01
    • 2016-08-14
    相关资源
    最近更新 更多