Comment prendre en charge des méthodes IDbConnection supplémentaires dans Dapper (à l'aide de DapperWrapper)?

.net c# dapper unit-testing

Question

J'essaie de créer des tests unitaires pour un référentiel qui utilise les méthodes Dapper, mais je ne parviens pas à trouver comment obtenir que mon code accepte une connexion fictive DbConnection. J'ai constaté que DapperWrapper reconnaît ce problème et répond à l'essentiel de mes besoins, mais l'interface IDbExecutor qu'elle fournit n'inclut pas certaines des méthodes de base de IDbConnection dont j'ai besoin dans mon code pour ouvrir et fermer la connexion.

Par exemple, ci-dessous est une propriété de la classe de référentiel de base qui définit la connexion à la base de données utilisée dans tous les référentiels, la récupère à partir d’une fabrique et ouvre la connexion si elle est fermée ou n’existe pas encore. Ce code ne fonctionne pas car IDbExecutor n'expose pas les méthodes Open ou Close et il ne peut pas y avoir de propriété State sur l'interface.

private IDbExecutor _db;

protected IDbExecutor Db
{
    get
    {
        if (_db == null)
        {
            _db = DbConnectionFactory.GetConnection();
            _db.Open();
        }
        else if (_db != null && _db.State != ConnectionState.Open)
        {
            _db.Open();
        }
        return _db;
    }

    set
    {
        _db = value;
    }
}

Existe-t-il un moyen d'étendre ou d'hériter IDbExecutor de manière à pouvoir référencer ces méthodes et propriétés pour la connexion SQL (et dans mon objet de connexion fictive)? Ou y a-t-il une meilleure approche de tout ce problème?

Modifier :

Vous trouverez ci-dessous un exemple de test que j'essaie de réaliser. J'ai créé une classe TestExecutor qui implémente IDbExecutor. Dans ce cas, il est configuré pour renvoyer les valeurs de test souhaitées. Nous utiliserons probablement une usine pour les créer ultérieurement en fonction de nos besoins en tests.

[Test]
public void TestGetAllDealsSuccess()
{        
    var executor = new TestExecutor();

    var dealRepo = new DealRepository(executor);
    var deals = dealRepo.GetAllDeals();

    //verify that expected deal data was returned
}

DealRepository est basé sur une classe AbstractRepository qui contient la propriété DB indiquée ci-dessus.

protected AbstractBaseRepository(IDbExecutor conn)
{
    _db = conn;
}

Ensuite, dans le DealRepository lui-même, nous exécutons nos requêtes sur l'objet de base de données:

var results = Db.Query<Deal>("GetDeals", sprocParameters).ToList();

Lorsque cette propriété Db est appelée, elle exécute le code d’obtention de l’extrait original ci-dessus, ce qui garantit que l’objet existe et est ouvert, et en crée un et l’ouvre. C'est là que nous rencontrons le problème - puisque les membres Open et State n'existent pas sur IDbExecutor.

Réponse populaire

Jetez un coup d'œil à DataAbstractions.Dapper .

"Une légère abstraction autour de Dapper et Dapper.Contrib qui maintient également le comportement IDbConnection."



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