La respuesta corta es Lea la entrada de The Fine Manual sobre pruebas de bases de datos en el manual de PHPUnit .
Y ahora la respuesta larga...
Lo primero que debe recordar acerca de las pruebas unitarias es que debe realizarse en aislamiento de todos los demás componentes. A menudo, este objetivo se simplifica utilizando técnicas de inversión de control (IoC) como inyección de dependencia . Cuando sus clases solicitan explícitamente sus dependencias en los métodos constructores, es una operación simple para burla esas dependencias para que pueda probar el código restante de forma aislada.
Sin embargo, probar el código que interactúa con los modelos es un poco diferente. Por lo general, no es práctico ni aconsejable inyectar sus modelos en la clase en la que necesita acceder a ellos. Sus modelos son generalmente estructuras de datos "tontas" que exponen capacidades limitadas o nulas. Como resultado, generalmente es aceptable (en términos de capacidad de prueba) crear instancias de sus modelos sobre la marcha dentro de sus clases inyectadas de otro modo. Desafortunadamente, esto dificulta la prueba del código de la base de datos porque, como señala la documentación de PHPUnit:
Entonces, ¿cómo aísla y prueba el código que interactúa con la base de datos si los modelos no se inyectan directamente? La forma más sencilla de hacer esto es utilizar dispositivos de prueba .
Ya que definitivamente ya estás usando PDO
o una biblioteca ORM que se basa en PDO
(¿verdad?), configurar los accesorios es tan simple como sembrar una base de datos SQLite básica o un archivo XML con datos para acomodar sus casos de prueba y usar esa conexión de base de datos especial cuando prueba el código que interactúa con la base de datos. Puede especificar esta conexión en su archivo de arranque PHPUnit, pero probablemente sea más apropiado desde el punto de vista semántico configurar una PHPUnit Database TestCase
.
Los pasos de mejores prácticas generalmente aceptados para probar el código de base de datos (estos también se repiten en la documentación de PHPUnit sobre pruebas de base de datos):
- Configurar dispositivo
- Sistema de ejercicios bajo prueba
- Verificar resultado
- Desmontaje
Entonces, para resumir, todo lo que necesita hacer es crear un accesorio de base de datos "ficticio" y hacer que su código interactúe con esos datos conocidos en lugar de una base de datos real que usaría en producción. Este método le permite aislar con éxito el código bajo prueba porque trata con datos conocidos, y esto significa que puede hacer afirmaciones específicas/comprobables sobre los resultados de las operaciones de su base de datos.
ACTUALIZAR
Solo porque es una guía extraordinariamente útil para lo que no hacer en su código si desea promover la capacidad de prueba, estoy agregando un enlace a Cómo escribir 3v1L, código no comprobable . No está relacionado con las pruebas de la base de datos en particular, pero es útil de todos modos. ¡Feliz prueba!
ACTUALIZACIÓN 2
Quería responder al comentario sobre posponer la prueba del modelo porque el código base existente no implementa PDO
para el acceso a la base de datos:
Tus modelos no tienen que usar PDO para implementar la extensión DbUnit de PHPUnit.
Hará su vida un poco más fácil si usa PDO, pero no está obligado a hacerlo. Digamos, por ejemplo, que ha creado su aplicación con el pg_*
integrado de PHP Funciones PostgreSQL. PHPUnit aún le permite especificar accesorios y aún puede reconstruirlos para cada prueba; simplemente necesitaría apuntar su conexión al realizar pruebas al mismo recurso que usa la extensión DbUnit para su accesorio.