DbConnection sans Db utilisant DataSet en mémoire (ou similaire) en tant que source

StackOverflow https://stackoverflow.com/questions/683395

  •  22-08-2019
  •  | 
  •  

Question

Je suis en train de test unitaire quelques classes .NET (pour des raisons de bonne conception) nécessitent DbConnections pour faire leur travail. Pour ces tests, j'ai certaines données en mémoire pour donner en entrée à ces classes.

Ces données en mémoire peuvent être facilement exprimés en DataTable (ou un DataSet qui contient ce DataTable), mais si une autre classe était plus appropriée je pourrais l'utiliser.

Si je en quelque sorte par magie en mesure d'obtenir un DbConnection qui représente une connexion aux données en mémoire, alors je pourrais construire mes objets, ont les exécuter leurs requêtes sur les données en mémoire, et veiller à ce que leur production correspondait aux attentes . Est-il possible d'obtenir un DbConnection aux données en mémoire? Je n'ai pas la liberté d'installer un logiciel tiers supplémentaire pour y arriver, et idéalement, je ne veux pas toucher le disque au cours des essais.

Était-ce utile?

La solution

Au lieu de consommer un DbConnection vous pouvez consommer IDbConnection et moquer? Nous faisons quelque chose de similaire, passer la maquette d'un DataSet. DataSet.CreateDataReader retourne un DataTableReader qui hérite de DbDataReader.

Nous avons enveloppé DbConnection dans notre propre interface comme IDbConnection auquel nous avons ajouté une méthode ExecuteReader () qui retourne une classe qui implémente les mêmes interfaces que DbDataReader. Dans notre maquette, ExecuteReader retourne simplement ce que DataSet.CreateDataReader sert.

Sons type de rond-point, mais il est très pratique pour construire un DataSet avec peut-être beaucoup resultsets. Nous nommons les DataTables après les procs stockés qu'ils représentent les résultats de, et notre maquette IDbConnection saisit le droit Datatable en fonction du proc client appelle. DataTable met également en œuvre CreateDataReader donc nous sommes prêts à partir.

Autres conseils

Une approche que je l'ai utilisé est de créer une base de données SQLite en mémoire. Cela peut être fait simplement en tirant dans le paquet System.Data.SQLite.Core NuGet à votre projet de test unitaire, vous n'avez pas besoin d'installer un logiciel partout ailleurs.

Bien que cela ressemble à une idée vraiment évidente, il n'a pas été jusqu'à ce que je regardais les tests unitaires Dapper que je pensais d'utiliser moi-même la technique! Voir la méthode "GetSqliteConnection" dans

https://github.com/ StackExchange / dapper-dot-net / blob / bffb0972a076734145d92959dabbe48422d12922 / Dapper.Tests / Tests.cs

Une chose à savoir est que si vous créez un sqlite db en mémoire et créer et alimenter des tables, vous devez être prudent de ne pas fermer la connexion avant d'effectuer vos requêtes de test, car l'ouverture d'une nouvelle connexion en mémoire vous obtenez une connexion à un nouveau base de données en mémoire, pas la base de données que vous venez soigneusement préparé pour vos tests! Pour certains de mes tests, j'utilise une implémentation IDbConnection personnalisée qui maintient la connexion ouverte pour éviter cet écueil -. Par exemple

https://github.com/ProductiveRage/SqlProxyAndReplay/blob/ maître / Tests / StaysOpenSqliteConnection.cs

Typemock? (Vous devrez 'installera cependant).

Soyez prudent en supposant que * des données peut vous donner des crochets appropriés pour les tests - son joli le pire des cas en général. Mais vous dites bonnes raisons de conception, donc je suis sûr que ce tout couvert: D

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top