2010-04-24 11 views
7

¿Se puede hacer sin necesidad de utilizar Typemock Islolator? He encontrado algunas sugerencias en línea, como pasa en una única cadena de conexión de metadatos, sin embargo, nada de lo que he encontrado, además Typemock parece permitir realmente para un simulacro de ObjectContext que se puede inyectar en los servicios para las pruebas unitarias. ¿Sueldo el $$ para TypeMock, o hay alternativas? ¿Nadie ha logrado crear algo comparable a TypeMock de código abierto?EF4: ¿es posible simular ObjectContext para probar la unidad?

+1

Una sugerencia que he visto es romper las reglas que vuelven a probar contra el DB. El tipo dijo que usa CreateDatabase() para crear localmente una instancia de db "simulada" sobre la marcha. En general, quiero evitar esto ya que rompimos esta regla en un proyecto anterior y no funcionó tan bien. Estaba bien hasta unos ~ 600 pruebas, pero al final con> 2000 pruebas de que era totalmente inútil para la verdadera TDD y corrió las pruebas en "modo batch" de vez en cuando (se tarda 5 minutos o más para ejecutarlas). –

Respuesta

4

estoy unidad de prueba EF4 fácilmente sin burlarse. Lo que hice fue crear una interfaz de repositorio usando el código de http://elegantcode.com/2009/12/15/entity-framework-ef4-generic-repository-and-unit-of-work-prototype/ como base. Luego creé una clase InMemoryRepository<T> que usaba la interfaz IRepository. entonces sustituye el IObjectSet<T> con un interior List<T> de la clase y cambió de métodos de recuperación en consecuencia.

Por lo tanto, si necesita realizar pruebas unitarias, pase el InMemoryRepository en lugar del DataRepository.

+1

-1 Linq2Objects se comporta de forma diferente a Linq2Entities. Es posible que las pruebas pasen contra una lista pero fallan cuando EF lo analiza en SQL. –

+0

No hay forma de pasarlo sin acceder a la base de datos, así que no estoy seguro de cuál es su punto. Burlarse no significa que sus Linq2Entities siempre serán válidas y funcionarán correctamente también. – KallDrexx

+2

Encapule sus consultas y pruébelas en una base de datos real. Luego simulémoslos al probar su lógica comercial. Por lo tanto, cada consulta es un componente reutilizable, ya que un hecho funcionará. Y su lógica de negocio se prueba sin requerir una base de datos que se encuentre en el estado esperado. –

1

Envuelva el ObjectContext en una clase de proxy. Luego, inyecta eso en tus clases.

+0

Sí, lo probé, y es una posibilidad; sin embargo, todos estos enfoques que usan proxies tienen sus propias limitaciones. Linq funciona de manera diferente por una cosa (se usa Linq para objetos, frente a Linq para entidades). –

+2

cierto, pero esperando las pruebas unitarias para recoger las diferencias en las diferentes implementaciones de LINQ parece un poco por la borda para pruebas unitarias. Eso más en el campo de pruebas de integración, ¿no crees? – SamuelWarren

3

Ponga su consulta Linq2Entity detrás de una interfaz, unidad de prueba de forma aislada contra una base de datos real.

Escriba pruebas para su lógica de negocio con simulaciones para sus interfaces de consulta. ¡No dejes que Linq sangre en tu lógica de negocios!

¡No utilice el RepositoryPattern!

0

No creo que el patrón de repositorio es la única respuesta a la pregunta (que evita el problema, seguro)

me gusta esta respuesta - Creo más adecuado para la introducción de pruebas a una base de código existente Creating Interface for ObjectContext

Cuestiones relacionadas