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;
}
}
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:
Y luego, en el constructor de su clase de prueba, puede usar esta nueva clase AsyncFriendlyWebApplicationFactory en lugar de usar WebApplicationFactory directamente.
Con suerte, esta solución resolverá el problema de BackgroundService que impide que WebApplicationFactory.CreateClient se complete.