Probando escenarios de carga impaciente con Effort.EF6

c# effort entity-framework unit-testing

Pregunta

Estamos usando Effort.EF6 para crear un conjunto de pruebas para un servicio de API Web ASP.NET 2 que funciona en contra de una base de datos en memoria, y en su mayor parte es una experiencia maravillosa.

Sin embargo, por razones no relacionadas con esta pregunta, hemos tenido que desactivar la carga diferida en EF6 (ejecutando Configuration.LazyLoadingEnabled = false; en el constructor del contexto db), lo que significa que si olvidamos .Include() una relación En algún lugar y luego usarlo, obtenemos NullReferenceExceptions . Nos gustaría que nuestras pruebas detecten este tipo de errores.

Nuestra configuración de prueba es básicamente la siguiente:

  1. Crea una conexión db utilizando las fábricas de conexiones de Effort. Esta es una instancia de conexión única (con una clave única, cuando intentamos con conexiones persistentes) por prueba.
  2. Cree un contexto de base de datos con esa conexión y agregue los datos que queremos que existan para la prueba.
  3. Registre una anulación de servicio en el contenedor DI para el contexto db.

El problema es que no podemos descubrir cómo configurar Effort.EF6 para no permitir una carga lenta, ya que parece que todo lo que hemos agregado al contexto en nuestra configuración de prueba ya está cargado cuando se ejecuta el código bajo prueba, y por lo tanto nunca lo hacemos. Ver las excepciones. Suponemos que esto se debe a que estamos reutilizando la instancia de contexto entre la configuración de prueba y la ejecución real del código.

Si intentamos cambiar el tercer paso a lo siguiente:

  1. Registre una anulación de servicio en el contenedor DI para la conexión db.
  2. El contenedor DI crea una instancia de contexto db (tomando la conexión db como una dependencia inyectada)

en cambio, terminamos con un contexto de db vacío , es decir, no tiene datos a pesar de que agregamos algunos puntos de datos antes de ejecutar la prueba.

¿Cómo podemos construir e inyectar un contexto db usando Effort, que fallará si falta la instrucción .Include() pero funciona si está ahí?

Respuesta aceptada

También debe desactivarlo en el constructor para Effort.EF6, el que toma el objeto DbConnection .

Lo resolví para mi proyecto de Código de EF Primero como sigue:

public class MyDataContext : DbContext, IMyDataContext
{
    /*
    * the ohter stuff like IDbSet<T> etc.
    */


    public MyDataContext() : base("name=MyConnectionString")
    {
        Configure();
    }

    /// <summary>
    /// This constructor is for test usage only!
    /// </summary>
    /// <param name="connection">Test connection for in memory database</param>
    public MyDataContext(DbConnection connection) : base(connection, true)
    {
        Configure();
    }


    /// <summary>
    /// Configures the data context.
    /// </summary>
    private void Configure()
    {
        Configuration.LazyLoadingEnabled = false;
    }
}

Además, en mis proyectos de prueba estoy configurando archivos CSV de prueba. Effort.EF6 utilizará los archivos para crear una instancia de un contexto con datos sembrados. En mi caso, escribí un pequeño TestDataManager que ofrece la posibilidad de generar tablas específicas con archivos específicos.

Aquí hay un fragmento de código sobre cómo podría sembrar datos con Effort.EF6:

public class MyDataContext : DbContext, IMyDataContext
{
    /*
    * the ohter stuff like IDbSet<T> etc.
    */


    public MyDataContext() : base("name=MyConnectionString")
    {
        Configure();
    }

    /// <summary>
    /// This constructor is for test usage only!
    /// </summary>
    /// <param name="connection">Test connection for in memory database</param>
    public MyDataContext(DbConnection connection) : base(connection, true)
    {
        Configure();
    }


    /// <summary>
    /// Configures the data context.
    /// </summary>
    private void Configure()
    {
        Configuration.LazyLoadingEnabled = false;
    }
}

Tal vez esta entrada de blog podría ayudarte también.




Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué
Licencia bajo: CC-BY-SA with attribution
No afiliado con Stack Overflow
¿Es esto KB legal? Sí, aprende por qué