2011-06-21 7 views
8

En mi solución tengo pruebas unitarias que no dependen de la base de datos, sino burlas y pruebas de integración que tienen dependencias externas como la base de datos.Replicar el comportamiento de LINQ to Entities en pruebas unitarias que usan LINQ para el objeto

Cuando realizo pruebas unitarias con simulaciones, se utiliza LINQ to Object. Cuando se ejecutan las pruebas de integración o el programa real, se utiliza LINQ to Entities y es más estricto que LINQ to Object.

¿Hay alguna manera de replicar el comportamiento más estricto de LINQ To Object en mis pruebas unitarias?

Respuesta

6

Una vez que la unidad ha probado que la lógica funciona con IQueryable proporcionada por EF, simplemente no puede probarla con pruebas unitarias burlando EF. Eso siempre llevará a cambiar de linq a entidades a linq-to-objects. En el caso de algo simplificado, la forma correcta de manejar esto en la prueba unitaria es escribir un falso en lugar de simulacro. Fake simularía el comportamiento de la dependencia. En este caso, escribir un falso significa escribir al proveedor de EF trabajando en la recolección en memoria exactamente de la misma manera que el proveedor real trabaja con la base de datos. Escribir tal proveedor probablemente sea un proyecto en sí mismo.

Debido a que una vez que su lógica contiene consultas linq-a-entidades siempre debe probar con pruebas de integración o refactorizar el código para que la consulta en sí sea en método separado (probado por pruebas de integración) y la lógica anterior ahora dependa la clase que contiene el método en vez de EF misma - esto lleva al patrón de repositorio donde IQueryalbe no está expuesto pero el repositorio expone el método para cada consulta necesaria que opera en alguna entidad. Personalmente no me gustan este tipo de repositorios. Here is recent discussion sobre diferentes implementaciones de repositorio.

Si decide utilizar pruebas de integración para cambiar la base de datos a en memoria, con EFv4.1 y el código primero es posible cambiar simplemente la cadena de conexión a SQL Compact 4 y funcionará (a menos que esté usando Llamadas SQL o demandando algunos tipos especiales de SQL en el mapeo). En el caso de EF con el archivo EDMX, no funcionará, porque el archivo EDMX está estrechamente relacionado con la versión exacta de la base de datos. Tener EDMX especial solo para pruebas unitarias no es una opción porque volvería a probar un código diferente.

Here is set of related questions discutiendo los desafíos con la unidad de prueba de código EF y repositorios.

0

Puede utilizar el patrón de repositorio para definir la interfaz de IRepository, en su código real, puede implementarlo utilizando Entity Framework, y en su prueba de unidad, puede usar el marco de simulación para devolver los objetos para su prueba.

0

Si desea que su unidad pruebe la capa que habla con la base de datos para tener el valor real y todos los comportamientos como en el código de producción, necesita hablar con la base de datos. Se puede considerar que se está rompiendo la regla de no tener dependencias en la prueba unitaria, pero no hay otra manera de tener LINQ a Entidades haciendo su trabajo que dejarlo hablar con la base de datos real. Puede (y probablemente debería) ser una base de datos en memoria; consulte, por ejemplo, how is Ayende doing it.

Cuestiones relacionadas