¿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>();
}
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 deStartup
, 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 deConfigureServices
. Este método se ejecuta después del código deStartup
, lo que te permite eliminar la implementación de producción y agregar la simulada.También puedes intentar usar la interfaz
IClassFixture
para configurarTestServer
yHttpClient
en el constructor de tu clase de prueba.¡Espero que esto sea de ayuda!