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 reemplazar en InMemory DB .net?

Para las pruebas de integración, quiero reemplazar la conexión de la base de datos real con la base de datos en memoria. Pero de todas formas, en las pruebas, la conexión es con una base de datos real.

Estas son las dos opciones para reemplazarla con una base de datos en memoria:

public class TestWebApplicationFactory<tstartup> : WebApplicationFactory<tstartup> where TStartup: class
{
    protected override void ConfigureWebHost(IWebHostBuilder builder)
    {
        builder.ConfigureServices(services =>
        {
            services.RemoveAll(typeof(DbContextOptions<towncontext>));
            services.RemoveAll(typeof(TownContext));
            services.RemoveAll(typeof(IServiceCollection));
            services.AddDbContext<towncontext>(options => { 
                options.UseInMemoryDatabase("TestDb"); });

            services.RemoveAll(typeof(IServiceProvider));
            services.AddSingleton((serviceProvider) =>
            {
                var optionsBuilder = new DbContextOptionsBuilder<towncontext> 
                ().UseInMemoryDatabase("orders");
                return optionsBuilder.Options;
            });
        });   
        //... 
    }
    //... 
}

Se puede encontrar más información en GitHub en https://github.com/OlgerdDragon/WebApiTestGit.git en el archivo TestWebApplicationFactory.cs

Por favor, ayúdeme a reemplazar la base de datos correctamente.

Tags:  , , , ,

Answer

  1. Avatar for davy.ai

    Para reemplazar la base de datos real con una base de datos en memoria para pruebas de integración, puedes hacer uso de la clase TestWebApplicationFactory proporcionada en el fragmento de código anterior. En esta clase, el método ConfigureWebHost se sobrescribe para eliminar todos los servicios existentes relacionados con la base de datos y agregar una nueva instancia de DbContextOptions que utiliza la base de datos en memoria.

    Para utilizar esta clase en tus pruebas de integración, puedes crear una nueva instancia y llamar a su método CreateClient para obtener una instancia de TestServer que puedes utilizar para enviar solicitudes a los puntos finales de tu API. Esta instancia de TestServer utilizará la base de datos en memoria en lugar de la real, lo que te permitirá probar tu aplicación sin afectar los datos en tu entorno de producción o puesta en escena.

    Aquí tienes un ejemplo de cómo puedes usar la clase TestWebApplicationFactory en una prueba:

    public class MisPruebasDeIntegracion : IDisposable
    {
        private readonly TestWebApplicationFactory<mistartup> _factory;
        private readonly HttpClient _client;
    
        public MisPruebasDeIntegracion()
        {
            _factory = new TestWebApplicationFactory<mistartup>();
            _client = _factory.CreateClient();
        }
    
        public void Dispose()
        {
            _client.Dispose();
            _factory.Dispose();
        }
    
        [Fact]
        public async Task PruebaPuntoFinal()
        {
            // Realiza una solicitud a tu punto final de API utilizando la instancia _client
            // Esto utilizará la base de datos en memoria en lugar de la real
            var response = await _client.GetAsync("/api/mipuntofinal");
    
            // Asegúrate de que la respuesta sea la esperada
            response.EnsureSuccessStatusCode();
            // ...
        }
    }
    

    En este ejemplo, MiStartup es la clase que representa la configuración de inicio de tu API. Puedes reemplazarlo con el nombre real de tu clase de inicio.

    Al utilizar la clase TestWebApplicationFactory de esta manera, puedes cambiar fácilmente entre el uso de la base de datos real y la base de datos en memoria para tus pruebas de integración, sin tener que modificar el código de tu aplicación.

Comments are closed.