Testen von Euerladeszenarien mit Effort.EF6


Frage

Wir verwenden Effort.EF6 , um eine Testsuite für einen ASP.NET-Web-API-2-Dienst zu erstellen, der gegen eine In-Memory-Datenbank arbeitet, und zum größten Teil ist dies eine wunderbare Erfahrung.

Aus Gründen, die nichts mit dieser Frage zu tun haben, mussten wir jedoch das Lazy-Laden in EF6 abschalten (indem wir Configuration.LazyLoadingEnabled = false; ausführen Configuration.LazyLoadingEnabled = false; im Konstruktor des db-Kontextes), was bedeutet, dass wir eine .Include() vergessen Irgendwo und später verwenden wir es, NullReferenceExceptions . Wir möchten, dass unsere Tests diese Art von Fehlern erkennen.

Unser Testaufbau ist grundsätzlich wie folgt:

  1. Erstellen Sie eine Datenbankverbindung mit den Verbindungsfactorys von Effort. Dies ist eine eindeutige Verbindungsinstanz (mit einem eindeutigen Schlüssel, wenn wir es mit persistenten Verbindungen versuchen) pro Test.
  2. Erstellen Sie einen Datenbankkontext mit dieser Verbindung und fügen Sie die Daten hinzu, die für den Test vorhanden sein sollen.
  3. Registrieren Sie einen Service-Override im DI-Container für den DB-Kontext.

Das Problem ist, dass wir nicht herausfinden können, wie man "Effort.EF6" konfiguriert, um Lazy-Laden zu verbieten, da alles, was wir dem Kontext in unserem Test-Setup hinzugefügt haben, bereits geladen ist, wenn der getestete Code läuft Siehe die Ausnahmen. Wir nehmen an, dass dies darauf zurückzuführen ist, dass wir die Kontextinstanz zwischen Test-Setup und tatsächlicher Codeausführung erneut verwenden.

Wenn wir versuchen, den dritten Schritt auf Folgendes zu setzen:

  1. Registrieren Sie einen Service-Override im DI-Container für die Datenbankverbindung.
  2. Der DI-Container erstellt eine DB-Kontextinstanz (wobei die db-Verbindung als eingefügte Abhängigkeit verwendet wird).

Wir enden stattdessen mit einem leeren db-Kontext, dh es hat keine Daten, obwohl wir vor dem Test einige Datenpunkte hinzugefügt haben.

Wie können wir einen Db-Kontext mit Effort .Include() , der fehlschlägt, wenn die .Include() fehlt, aber funktioniert, wenn sie da ist?

Akzeptierte Antwort

Sie müssen es auch im Konstruktor für Effort.EF6 deaktivieren - das, das das DbConnection Objekt übernimmt.

Ich habe es für mein EF Code First-Projekt wie folgt gelöst:

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

Außerdem richte ich in meinen Testprojekten Test-CSV-Dateien ein. Die Dateien werden von Effort.EF6 verwendet, um einen Kontext mit gesetzten Daten zu instanziieren. In meinem Fall habe ich einen kleinen TestDataManager geschrieben, der die Möglichkeit gibt, bestimmte Tabellen mit bestimmten Dateien zu säen.

Hier ist ein Stück Code, wie Sie Daten mit Mühe.EF6 säen können:

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

Vielleicht könnte dir dieser Blogbeitrag auch helfen.





Lizenziert unter: CC-BY-SA
Nicht verbunden mit Stack Overflow
Ist diese KB legal? Ja, lerne warum