DbConnection sin Db usando conjunto de datos en memoria (o similar) como fuente

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

  •  22-08-2019
  •  | 
  •  

Pregunta

Estoy tratando de probar la unidad algunas clases .NET que (por razones de diseño) requieren DbConnections para hacer su trabajo. Para estas pruebas, tengo ciertos datos en la memoria para dar como entrada a estas clases.

Que los datos en memoria podrían expresarse fácilmente como un DataTable (o un conjunto de datos que contiene ese DataTable), pero si otra clase eran más apropiado que podía usar.

Si estuviera de alguna manera mágica capaz de obtener una DbConnection que representaba una conexión con los datos de la memoria, entonces podría construir mis objetos, haga que ejecutar sus consultas en los datos en memoria, y asegurarse de que su producción altura de las expectativas . ¿Hay alguna manera de conseguir un DbConnection de datos de la memoria? no tengo la libertad de instalar ningún software adicional de terceros para que esto suceda, y lo ideal, yo no quiero tocar el disco durante las pruebas.

¿Fue útil?

Solución

En lugar de consumir una DbConnection se puede consumir IDbConnection y se burlan de él? Hacemos algo similar, pase el simulacro de un conjunto de datos. DataSet.CreateDataReader devuelve un DataTableReader que hereda de DbDataReader.

Hemos envuelto DbConnection en nuestra propia interfaz IDbConnection similar a la que hemos añadido un método ExecuteReader () que devuelve una clase que implementa las mismas interfaces que DbDataReader. En nuestra maqueta, ExecuteReader simplemente devuelve lo DataSet.CreateDataReader sirve.

Sonidos especie de rotonda, pero es muy conveniente para construir un conjunto de datos con, posiblemente, muchos conjuntos de resultados. Llamamos a las tablas de datos después de los procedimientos almacenados que representan los resultados de, y nuestra maqueta IDbConnection agarra la derecha Datatable basado en el proc el cliente está llamando. DataTable también implementa CreateDataReader para que quede listo para salir.

Otros consejos

Un enfoque que he utilizado es crear una base de datos SQLite en memoria. Esto puede hacerse simplemente tirando en el paquete System.Data.SQLite.Core NuGet a su proyecto de prueba de unidad, que no es necesario instalar ningún software en cualquier otro lugar.

A pesar de que suena como una idea muy obvio, no fue sino hasta que estaba mirando las pruebas unitarias Dapper que había pensado utilizar la técnica de mí mismo! Véase el método "GetSqliteConnection" en

https://github.com/ StackExchange / pulcro-punto-net / burbuja / bffb0972a076734145d92959dabbe48422d12922 / Dapper.Tests / Tests.cs

Una cosa a tener en cuenta es que si crea una db sqlite en memoria y crear y llenar las tablas, es necesario tener cuidado de no cerrar la conexión antes de realizar sus consultas de prueba debido a la apertura de una nueva conexión en memoria se conseguir que una conexión a un nueva base de datos en memoria, no la base de datos que acaba cuidadosamente preparado para las pruebas! Para algunos de mis pruebas, utilizo una aplicación IDbConnection personalizado que mantiene la conexión abierta para evitar este escollo -. Ej

https://github.com/ProductiveRage/SqlProxyAndReplay/blob/ maestro / pruebas / StaysOpenSqliteConnection.cs

Typemock? (Usted tendría que 'instalar', aunque).

Tenga cuidado si se asume que los datos * le puede dar ganchos adecuados para la prueba - es bastante el peor de los casos, en general. Pero usted dice buenas razones de diseño, así que estoy seguro de que es todo lo que abarca: D

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top