Cómo solucionar los problemas de PHPUnit en las aplicaciones Symfony 3.2
El problema
Si has actualizado tus aplicaciones Symfony a la versión 3.2 y ejecutas los tests con el archivo PHAR de PHPUnit, te encontrarás con el siguiente mensaje de error:
$ cd mi-proyecto/ $ php phpunit.phar PHPUnit 5.6.2 by Sebastian Bergmann and contributors. PHP Fatal error: Undefined class constant 'PARSE_CONSTANT' in vendor/symfony/symfony/src/Symfony/Component/DependencyInjection/ Loader/YamlFileLoader.php on line 396
La solución
Los tests de las aplicaciones Symfony 3.2 no se pueden ejecutar con el archivo PHAR de PHPUnit. En su lugar tienes que utilizar el component PHPUnit Bridge Si no lo has hecho ya, instala el component de la siguiente manera:
$ cd mi-proyecto/ $ composer require --dev symfony/phpunit-bridge
Ahora ya puedes ejecutar los tests con el siguiente comando (la primera vez va a tardar un poco porque se tiene que descargar y crear el archivo de PHPUnit):
$ cd mi-proyecto/ $ ./vendor/bin/simple-phpunit
Dependiendo de tu configuración Symfony, el anterior comando también puede
ejecutarse como: ./bin/simple-phpunit
La explicación
Este error sucede cuando el código que se está testeando comparte dependencias con PHPUnit pero requiere unas versiones diferentes a las que usa PHPUnit. En las aplicaciones Symfony, esto sucede con el component Yaml, que también lo utiliza PHPUnit.
PHPUnit está intentando solucionar este problema añadiendo automáticamente un prefijo único en todos los namespaces de PHP (ver detalles), pero todavía no han podido completarlo.
Mientras tanto, la mejor solución consiste en utilizar el componente
"PHPUnit Bridge". Además de no incluir las dependencias conflictivas (como por
ejemplo symfony/yaml
) este component incluye otras ventajas:
- Selecciona la mejor versión de PHPUnit en función de tu versión de PHP.
- Paraleliza la ejecución de los tests cuando se le pasa un directorio como argumento.
Durante el desarrollo del proyecto Symfony hemos sufrido este problema desde
hace tiempo. Por eso verás que en muchos archivos .travis.yml
de Symfony se
utiliza el comando simple-phpunit
en vez de phpunit
.
Además del componente Symfony Yaml, también puedes sufrir este problema al
utilizar prophecy
como dependencia. En la documentación de PHPUnit Bridge
tienes más información sobre cómo solucionarlo.
Comentarios
Proyectos Symfony destacados
La plataforma de eCommerce 100% Symfony que rivaliza con Magento y PrestaShop. Ver más
Síguenos en @symfony_es para acceder a las últimas noticias.