Test di scenari di carico impaziente con Effort.EF6

c# effort entity-framework unit-testing

Domanda

Stiamo utilizzando Effort.EF6 per creare una suite di test per un servizio Web API 2 di ASP.NET che funzioni contro un database in memoria e per la maggior parte è un'esperienza meravigliosa.

Tuttavia, per ragioni estranee a questa domanda, abbiamo dovuto disattivare il caricamento pigro in EF6 (eseguendo Configuration.LazyLoadingEnabled = false; nel costruttore del contesto db), il che significa che se ci dimentichiamo di .Include() una relazione da qualche parte e in seguito lo usiamo, otteniamo NullReferenceExceptions . Vorremmo che i nostri test prendessero questi tipi di errori.

La nostra configurazione di prova è fondamentalmente la seguente:

  1. Creare una connessione db usando le factory di connessione di Effort. Questa è un'istanza di connessione univoca (con una chiave univoca, quando proviamo con connessioni persistenti) per test.
  2. Crea un contesto db con quella connessione e aggiungi i dati che vogliamo esistere per il test.
  3. Registrare un servizio sovrascritto nel contenitore DI per il contesto db.

Il problema è che non riusciamo a capire come configurare Effort.EF6 per disabilitare il caricamento lento, poiché sembra che tutto ciò che abbiamo aggiunto al contesto nella nostra configurazione di test sia già caricato quando viene eseguito il codice sotto test, e quindi non abbiamo mai vedere le eccezioni. Supponiamo che ciò avvenga perché stiamo riutilizzando l'istanza di contesto tra l'impostazione del test e l'esecuzione effettiva del codice.

Se proviamo a cambiare il terzo passo con il seguente:

  1. Registrare una sovrascrittura del servizio nel contenitore DI per la connessione db.
  2. Il contenitore DI crea un'istanza di contesto db (prendendo la connessione db come dipendenza iniettata)

finiamo invece con un contesto db vuoto , cioè non ha dati nonostante avessimo aggiunto alcuni punti dati prima dell'esecuzione del test.

Come possiamo costruire e iniettare un contesto db usando Effort, che fallirà se manca l' .Include() ma funzionerà se è lì?

Risposta accettata

Devi disattivarlo anche nel costruttore per Effort.EF6 - quello che prende l'oggetto DbConnection .

L'ho risolto per il mio codice EF Primo progetto come segue:

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;
    }
}

Inoltre nei miei progetti di test sto configurando i file CSV test. I file verranno utilizzati da Effort.EF6 per creare un'istanza di un contesto con i dati di inizializzazione. Nel mio caso ho scritto un piccolo TestDataManager che dà la possibilità di seminare tabelle specifiche con file specifici.

Ecco un pezzo di codice su come poter seminare i dati 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;
    }
}

Forse questo post sul blog potrebbe aiutarti anche tu.




Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché
Autorizzato sotto: CC-BY-SA with attribution
Non affiliato con Stack Overflow
È legale questo KB? Sì, impara il perché