es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

El servicio en segundo plano está bloqueando la finalización de WebApplicationFactory.CreateClient en la prueba de integración.

Estamos utilizando SpecFlow para escribir pruebas de integración para una aplicación web .net-core-3.1. Nuestra aplicación web incluye un BackgroundService utilizado para suscribirse a Kafka. La presencia de este BackgroundService evita que el método WebApplicationFactory.CreateClient se complete. He leído que algunas personas han experimentado un problema similar en entornos de pruebas con recursos limitados, pero esto nos está sucediendo en computadoras portátiles modernas.

El constructor de nuestra clase de prueba:

public PocServiceSteps(ScenarioContext context)
{
    _context = context;
    _factory = new WebApplicationFactory<startup>()
    .WithWebHostBuilder(builder =>
    {
        builder.ConfigureServices(services =>
        {
            // establecer aquí los cambios de servicios requeridos
        });
    });

    // este método nunca se completa
    _client = _factory.CreateClient(new WebApplicationFactoryClientOptions
    {
        BaseAddress = new Uri("http://localhost:5000/")
    });
}

Una cosa que hemos intentado es reemplazar la clase WebApplicationFactory según lo descrito en https://www.strathweb.com/2021/05/the-curious-case-of-asp-net-core-integration-test-deadlock/, pero esto no resuelve el problema:

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;
}
}

Tags:  , , ,

Answer

  1. Avatar for davy.ai

    Solución para SpecFlow con BackgroundService que impide que WebApplicationFactory.CreateClient se complete

    Si está utilizando SpecFlow para escribir pruebas de integración para su aplicación Web .net-core-3.1 y su aplicación web incluye un BackgroundService que se utiliza para suscribirse a Kafka, la presencia de este BackgroundService puede evitar que el método WebApplicationFactory.CreateClient se complete. Incluso si tiene portátiles nuevos y modernos, todavía puede enfrentarse a este problema.

    Para resolver este problema, puede intentar anular WebApplicationFactory creando una nueva clase llamada AsyncFriendlyWebApplicationFactory, que heredará de WebApplicationFactory.

    Aquí está el código de ejemplo:

    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;
        }
    }
    

    Y luego, en el constructor de su clase de prueba, puede usar esta nueva clase AsyncFriendlyWebApplicationFactory en lugar de usar WebApplicationFactory directamente.

    public PocServiceSteps(ScenarioContext context)
    {
        _context = context;
    
        _factory = new AsyncFriendlyWebApplicationFactory<startup>()
        .WithWebHostBuilder(builder => builder.ConfigureServices(services =>
        {
            // configure cualquier cambio de servicios requeridos aquí
        }));
    
        _client = _factory.CreateClient(
            new WebApplicationFactoryClientOptions
            {
                BaseAddress = new Uri($"http://localhost:5000/")
            }
        );
    }
    

    Con suerte, esta solución resolverá el problema de BackgroundService que impide que WebApplicationFactory.CreateClient se complete.

Comments are closed.