Test de scénarios de chargement rapide avec Effort.EF6


Question

Nous utilisons Effort.EF6 pour créer une suite de tests pour un service ASP.NET Web API 2 s’appuyant sur une base de données en mémoire. C’est pour la plupart une expérience merveilleuse.

Cependant, pour des raisons indépendantes de cette question, nous avons dû désactiver le chargement différé dans EF6 (en exécutant Configuration.LazyLoadingEnabled = false; dans le constructeur du contexte de la base de données), ce qui signifie que si nous oublions de .Include() une relation quelque part et plus tard, nous obtenons NullReferenceExceptions . Nous aimerions que nos tests détectent ce type d’erreurs.

Notre configuration de test est fondamentalement la suivante:

  1. Créez une connexion à la base de données en utilisant les fabriques de connexions d’Effort. Il s'agit d'une instance de connexion unique (avec une clé unique, lorsque nous essayons avec des connexions persistantes) par test.
  2. Créez un contexte de base de données avec cette connexion et ajoutez les données que nous voulons exister pour le test.
  3. Enregistrez une substitution de service dans le conteneur DI pour le contexte de base de données.

Le problème est que nous ne pouvons pas comprendre comment configurer Effort.EF6 pour interdire le chargement paresseux, car il semble que tout ce que nous avons ajouté au contexte dans notre configuration de test est déjà chargé lorsque le code sous test est exécuté. voir les exceptions. Nous supposons que c'est parce que nous réutilisons l'instance de contexte entre la configuration du test et l'exécution réelle du code.

Si nous essayons de passer à la troisième étape comme suit:

  1. Enregistrez une substitution de service dans le conteneur DI pour la connexion à la base de données.
  2. Le conteneur DI crée une instance de contexte de base de données (en prenant la connexion à la base de données comme dépendance injectée)

nous nous retrouvons plutôt avec un contexte de base de données vide , c'est-à-dire qu'il ne contient aucune donnée bien que nous ayons ajouté quelques points de données avant d'exécuter le test.

Comment pouvons-nous construire et injecter un contexte de base de données en utilisant Effort, ce qui échouera si l'instruction .Include() est manquante mais fonctionne si elle existe?

Réponse acceptée

Vous devez également le désactiver dans le constructeur pour Effort.EF6 - celui qui prend l'objet DbConnection .

Je l'ai résolu pour mon projet EF Code First comme suit:

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

De plus, dans mes projets de test, je configure des fichiers de test CSV. Effort.EF6 utilisera les fichiers pour instancier un contexte avec des données semées. Dans mon cas, j'ai écrit un petit TestDataManager qui permet de créer des tables spécifiques avec des fichiers spécifiques.

Voici un morceau de code permettant de créer des données avec 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;
    }
}

Peut-être que ce blog pourrait vous aider aussi.





Sous licence: CC-BY-SA
Non affilié à Stack Overflow
Est-ce KB légal? Oui, apprenez pourquoi