2010-05-02 11 views
6

Tengo algunas clases de repositorio que están destinadas a hablar con diferentes tipos de datos, que se derivan de una interfaz IRepository.¿Cómo se evalúa la unidad de una clase que debe hablar con los datos?

En las implementaciones, el código se comunica con una fuente de datos, ya sea un directorio de archivos XML o una base de datos o incluso solo un caché. ¿Es posible probar de manera confiable cualquiera de estas implementaciones? No veo que funcione una implementación simulada, porque entonces solo estoy probando el código simulado y no el código real.

Respuesta

8

No, utilizaría un simulacro cuando estaba escribiendo una clase que utiliza y IRepository. Para las implementaciones de IRepository, debe probar contra la fuente de datos apropiada. Para las bases de datos, eso es un poco doloroso, para un sistema de archivos, un poco menos.

Donde sea posible, si puede expresar su implementación en términos de transmisiones o lectores, le hará la vida más fácil: las pruebas de esas partes de la implementación pueden ir contra fuentes de datos en memoria o flujos de recursos en la prueba montaje. Por supuesto, es probable que necesite algunas pruebas que van a una base de datos real o al sistema de archivos, pero ojalá menos.

Ya sea que llames a tales pruebas pruebas de "unidad" o no, es cuestión de cómo defines las pruebas unitarias; personalmente no me importan demasiado los nombres involucrados, pero I do se preocupan por las pruebas. Para las bases de datos en particular, estas pueden ser algo dolorosas (especialmente si desea poder ejecutar pruebas en paralelo), pero también pueden ser increíblemente valiosas, según mi experiencia.

1

Creo que si está probando el código que realmente persiste o consulta datos, es probable que realmente quiera acceder a una base de datos.

Estas son pruebas de integración en lugar de pruebas unitarias.

Puede configurar una base de datos de prueba, en la que conozca el estado de los datos, y ejecutar las pruebas al respecto. Probablemente también quiera decirles a las pruebas que son diferentes de las pruebas de su unidad y no necesitan ejecutarse cada vez que ingresen (en nUnit puede decorar su clase de prueba con un atributo que dice que no se ejecute)

1

Ampliamente hablando, no unidad prueba ningún código cuyo único propósito sea hablar con una fuente de datos. Es posible que aún desee probar el repositorio automáticamente, pero dicha prueba será una prueba de integración por definición. Probablemente no desee ejecutar esas pruebas como parte de las compilaciones de "primer paso" como, por ejemplo, la configuración de la base de datos y la limpieza después de usted puede tomar una cantidad no despreciable de tiempo.

Si su repositorio tiene otras responsabilidades (por ejemplo, la implementación del patrón de Unidad de trabajo), entonces es posible que desee probarlas por separado.

1

En algún momento de la implementación del IRepository usará una API de terceros que realmente leerá/escribirá en/from database/file/xml. Lo que quiere hacer es burlarse de esas API para asegurarse de que su código llame a la API correcta en el orden correcto.

Si está leyendo desde la base de datos, puede simular SqlConnection y SqlCommand y asegurarse de llamar a los métodos correctos en esas clases. Si está escribiendo en una transmisión, puede simular la transmisión y asegurarse de que la descarga y la eliminación (por ejemplo).

Cuestiones relacionadas