Créer une procédure stockée dans la base de données Effort pour le test unitaire

c# effort entity-framework stored-procedures unit-testing

Question

J'ai une fonction appelant une procédure stockée avec Entity Framework:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

Et je voudrais créer un test unitaire pour cela en utilisant Effort. J'ai déjà Effort (et base de données NMemory) pour simuler une base de données (basée sur mon contexte), sur Initialize pour chaque test unitaire, comme:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

EffortProviderFactory est:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

J'ai testé l'ajout de la création de procédure stockée comme ça:

public async Task<List<Entity>> GetEntity(int id)
{
       var param = new SqlParameter("@id", id);
       return await myContext.Database
           .SqlQuery<MyEntity>("[myStoredProcedure] @id", param)
           .ToListAsync();
}

Mais il lève une NotSupportedException . Comment puis-je faire et quel est le meilleur moyen?

Réponse acceptée

Effort est un fournisseur de base de données en mémoire basé sur fichier qui fournit à une instance de DbContext une base de données temporaire appartenant à un particulier: nouveau contexte, nouvelle base de données, aucune interaction de test. C'est la bonne partie.

L'inconvénient, bien sûr, est qu'il ne s'agit pas - et ne sera jamais - d'un moteur de base de données à part entière. Par conséquent, il ne prendra jamais en charge les procédures stockées écrites dans les dialectes SQL les plus courants (comme t-SQL ou PL-SQL). Dans la mesure où Effort (c’est-à-dire NMemory) dispose de procédures stockées, il s’agit simplement d’un IQueryable stocké, comme l’ StoredProcedure constructeur StoredProcedure . Notant lié à distance aux procédures stockées t-SQL.

La seule façon de tester les procédures stockées dans votre code de couche d'accès aux données, ce qui est une très bonne idée, consiste à écrire des tests d'intégration. Il existe en gros deux approches pour rendre les tests d’intégration indépendants les uns des autres:

  • Créer / créer une nouvelle base de données pour chaque test

  • Utilisez une base de données existante avec des scénarios de test et annulez les modifications après chaque test, en utilisant par exemple TransactionScope .

Les tests d'intégration ne seront jamais aussi rapides que les tests unitaires et ne feront que compléter les tests unitaires. Néanmoins, dans ma propre pratique de codage liée aux couches de données, ils sont devenus des citoyens de premier ordre dans la suite de tests. Pour moi, la correction est plus importante que la vitesse.




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