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

Publicada el

13 de diciembre de 2016

Etiquetas

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.