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.

¿Cómo reemplazo las implementaciones de servicios para pruebas de integración de Web API utilizando TestHost.TestServer en .NET 5?

Estoy intentando mover mis pruebas de integración de WebApplicationFactory a TestServer en .NET 5. En mi implementación existente, puedo anular ConfigureWebHost y llamar a IWebHostBuilder.ConfigureServices para reemplazar las implementaciones de servicio con burlas. Esto se ejecuta después del código de inicio, lo que me permite eliminar la implementación de producción y agregar la burla.

Al tratar de lograr lo mismo usando TestServer, ConfigureServices siempre se ejecuta antes del código de inicio, sin importar en qué orden haga la configuración, lo que significa que siempre termino con ambas implementaciones en la colección de servicios y parece que “la última gana”, es decir, la versión de producción del servicio siempre se ejecuta.

¿Cómo puedo configurar el constructor para usar mi versión de prueba?

Estoy usando XUnit, así que quizás no lo estoy usando de la manera correcta con respecto a IClassFixture, etc.

Aquí está mi código:

public sealed class IntegrationTests : IDisposable
{
    private TestServer Server { get; }
    private HttpClient Client { get; }

public IntegrationTests()
{
    var builder = new WebHostBuilder()
        .UseConfiguration(new ConfigurationBuilder().AddJsonFile("appsettings.development.json").Build())
        .UseSerilog()
        // Cambiar el orden de las siguientes dos líneas no ayuda
        .UseStartup<Startup>()
        .ConfigureServices(UseDummyUserRepository);

    Server = new TestServer(builder);
    Client = Server.CreateClient();
}

private void UseDummyUserRepository(IServiceCollection services)
{
    // La siguiente línea no funciona ya que el servicio aún no está configurado
    //services.Remove(services.First(s => s.ServiceType == typeof(IUserRepository)));
    services.AddTransient<IUserRepository, DummyUserRepository>();
}


Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Parece que estás intentando reemplazar la implementación de producción de un servicio por una simulada en tus pruebas de integración. Has mencionado que estás utilizando XUnit y que estás intentando lograr esto utilizando TestServer.

    Parece que el problema que estás enfrentando es que el método ConfigureServices se ejecuta antes del código de Startup, lo que significa que la implementación de producción del servicio siempre se está ejecutando.

    Para resolver este problema, puedes intentar usar el método ConfigureTestServices en lugar de ConfigureServices. Este método se ejecuta después del código de Startup, lo que te permite eliminar la implementación de producción y agregar la simulada.

    También puedes intentar usar la interfaz IClassFixture para configurar TestServer y HttpClient en el constructor de tu clase de prueba.

    ¡Espero que esto sea de ayuda!

Comments are closed.