Muchas aplicaciones de bases de datos modernas utilizan el proyecto Doctrine ORM .
Se considera una buena pr谩ctica llevar el trabajo con la base de datos a los servicios. Y los servicios deben ser probados.
Para probar los servicios, puede conectar una base de datos de prueba o puede bloquear el Entity Manager y los repositorios. Con la primera opci贸n, todo est谩 claro, pero no siempre tiene sentido implementar una base de datos para probar el servicio. Hablaremos de esto.
Por ejemplo, tome el siguiente servicio:
src / Service / User / UserService.php Necesitamos probar su 煤nico m茅todo create()
.
Seleccione los siguientes casos:
- Creaci贸n de usuario exitosa sin referencia
- Creaci贸n de usuario exitosa con referencia
- Error "Inicio de sesi贸n ya tomado"
- Error "Referencia no encontrada"
Para probar el servicio, necesitamos un objeto que implemente la interfaz Doctrine\ORM\EntityManagerInterface
Opci贸n 1. Usamos una base de datos real
Escribiremos una clase base para las pruebas, de la que luego heredaremos.
Ahora tiene sentido que las pruebas establezcan variables de entorno. phpunit.xml
archivo phpunit.xml
en la secci贸n php
. Voy a usar sqlite db
phpunit.xml <?xml version="1.0" encoding="UTF-8"?> <phpunit xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:noNamespaceSchemaLocation="https://schema.phpunit.de/8.1/phpunit.xsd" bootstrap="vendor/autoload.php" executionOrder="depends,defects" forceCoversAnnotation="true" beStrictAboutCoversAnnotation="true" beStrictAboutOutputDuringTests="true" beStrictAboutTodoAnnotatedTests="true" verbose="true" colors="true"> <php> <env name="DB_DRIVER" value="pdo_sqlite" /> <env name="DB_PATH" value="var/db-test.sqlite" /> <env name="DB_USER" value="" /> <env name="DB_PASSWORD" value="" /> <env name="DB_NAME" value="" /> </php> <testsuites> <testsuite name="default"> <directory>tests/Unit</directory> </testsuite> </testsuites> <filter> <whitelist processUncoveredFilesFromWhitelist="true"> <directory suffix=".php">src</directory> </whitelist> </filter> </phpunit>
Ahora escribiremos una prueba de servicio
tests / Unit / Service / UserServiceTest.php Aseg煤rese de que nuestro servicio funcione correctamente
./vendor/bin/phpunit
Opci贸n 2. Usando MockBuilder
Construir una base de datos cada vez es dif铆cil. Especialmente phpunit nos da la oportunidad de recolectar moki sobre la marcha usando mockBuilder. Se puede encontrar un ejemplo en la documentaci贸n de Symfony.
Ejemplo de documentaci贸n de Symfony La opci贸n est谩 funcionando, pero hay problemas. Debe saber claramente en qu茅 secuencia el c贸digo accede a los m茅todos de EntityManager.
Por ejemplo, si un desarrollador intercambia la verificaci贸n de la existencia de un referente y una verificaci贸n de inicio de sesi贸n ocupado, la prueba se interrumpir谩. Pero la aplicaci贸n no lo es.
Propongo la opci贸n de Moking inteligente EntityManager, que almacena todos sus datos en la memoria y no utiliza una base de datos real.
Opci贸n 3. Utilizamos MockBuilder con almacenamiento de datos en la memoria.
Para mayor flexibilidad, agregaremos una variable de entorno para que pueda usar una base de datos real. Hagamos la invernada en phpunit.xml
phpunit.xml cambios <?xml version="1.0" encoding="UTF-8"?> <php> <env name="EMULATE_BD" value="1" /> </php>
Ahora modifique la clase base
pruebas modificadas / TestCase.php Ahora podemos ejecutar la prueba nuevamente y asegurarnos de que nuestro servicio funcione sin conectarse a la base de datos.
./vendor/bin/phpunit
C贸digo fuente disponible en Github