que - No se puede redeclarar el error de clase al generar el informe de cobertura de código PHPUnit
pruebas de php (5)
Descubrí que recibí este error cuando un @coversDefaultClass
incorrecto (lo mismo se aplica a @covers
también) se usó la anotación. En mi caso, era /Path/To//Class
(con el doble ''/') que estaba jugando con las llamadas requeridas.
Comenzar un proyecto con Zend Framework 1.10 y Doctrine 2 (Beta1). Estoy usando espacios de nombres en mi propio código de biblioteca.
Al generar informes de cobertura de código, aparece un error fatal sobre redeclarar una clase. Para proporcionar más información, he comentado la llamada xdebug_disable () en mi ejecutable phpunit para que pueda ver el rastro de la función (salida de variables locales desactivadas porque había demasiada salida).
Aquí está mi salida de terminal:
$ phpunit PHPUnit 3.4.12 by Sebastian Bergmann. ........ Time: 4 seconds, Memory: 16.50Mb OK (8 tests, 14 assertions) Generating code coverage report, this may take a moment.PHP Fatal error: Cannot redeclare class Cob/Application/Resource/HelperBroker in /Users/Cobby/Sites/project/trunk/code/library/Cob/Application/Resource/HelperBroker.php on line 93 PHP Stack trace: PHP 1. {main}() /usr/local/zend/bin/phpunit:0 PHP 2. PHPUnit_TextUI_Command::main() /usr/local/zend/bin/phpunit:54 PHP 3. PHPUnit_TextUI_Command->run() /usr/local/zend/share/pear/PHPUnit/TextUI/Command.php:146 PHP 4. PHPUnit_TextUI_TestRunner->doRun() /usr/local/zend/share/pear/PHPUnit/TextUI/Command.php:213 PHP 5. PHPUnit_Util_Report::render() /usr/local/zend/share/pear/PHPUnit/TextUI/TestRunner.php:478 PHP 6. PHPUnit_Framework_TestResult->getCodeCoverageInformation() /usr/local/zend/share/pear/PHPUnit/Util/Report.php:97 PHP 7. PHPUnit_Util_Filter::getFilteredCodeCoverage() /usr/local/zend/share/pear/PHPUnit/Framework/TestResult.php:623 Fatal error: Cannot redeclare class Cob/Application/Resource/HelperBroker in /Users/Cobby/Sites/project/trunk/code/library/Cob/Application/Resource/HelperBroker.php on line 93 Call Stack: 0.0004 322888 1. {main}() /usr/local/zend/bin/phpunit:0 0.0816 4114628 2. PHPUnit_TextUI_Command::main() /usr/local/zend/bin/phpunit:54 0.0817 4114964 3. PHPUnit_TextUI_Command->run() /usr/local/zend/share/pear/PHPUnit/TextUI/Command.php:146 0.1151 5435528 4. PHPUnit_TextUI_TestRunner->doRun() /usr/local/zend/share/pear/PHPUnit/TextUI/Command.php:213 4.2931 16690760 5. PHPUnit_Util_Report::render() /usr/local/zend/share/pear/PHPUnit/TextUI/TestRunner.php:478 4.2931 16691120 6. PHPUnit_Framework_TestResult->getCodeCoverageInformation() /usr/local/zend/share/pear/PHPUnit/Util/Report.php:97 4.2931 16691148 7. PHPUnit_Util_Filter::getFilteredCodeCoverage() /usr/local/zend/share/pear/PHPUnit/Framework/TestResult.php:623
(No tengo idea de por qué muestra el error dos veces ...?)
Y aquí está mi phpunit.xml:
<phpunit bootstrap="./code/tests/application/bootstrap.php" colors="true">
<!-- bootstrap.php changes directory to trunk/code/tests,
all paths below are relative to this directory. -->
<testsuite name="My Promotions">
<directory>./</directory>
</testsuite>
<filter>
<whitelist>
<directory suffix=".php">../application</directory>
<directory suffix=".php">../library/Cob</directory>
<exclude>
<!-- By adding the below line I can remove the error -->
<file>../library/Cob/Application/Resource/HelperBroker.php</file>
<directory suffix=".phtml">../application</directory>
<directory suffix=".php">../application/doctrine</directory>
<file>../application/Bootstrap.php</file>
<directory suffix=".php">../library/Cob/Tools</directory>
</exclude>
</whitelist>
</filter>
<logging>
<log type="junit" target="../../build/reports/tests/report.xml" />
<log type="coverage-html" target="../../build/reports/coverage" charset="UTF-8"
yui="true" highlight="true" lowUpperBound="50" highLowerBound="80" />
</logging>
</phpunit>
He añadido una etiqueta dentro de las costuras para ocultar este problema. Tengo otro recurso de aplicación, pero no parece tener un problema (el otro es un recurso de Doctrine 2). No estoy seguro de por qué es específico de esta clase, toda mi biblioteca está cargada automáticamente, por lo que no es necesario incluir / requerir llamadas en ningún lado. Supongo que debe tenerse en cuenta que HelperBroker es el primer archivo en el sistema de archivos que proviene de la biblioteca / Cob
Estoy en Snow Leopard con las versiones más recientes / recientes de todo el software (Zend Server, Zend Framework, Doctrine 2 Beta1, Phing, PHPUnit, PEAR).
Esto me sucedió porque tuve un error tipográfico en mi declaración @covers. Observe el extra / en la primera línea.
App/Controller//Account/UsersController::forgotPassword()
VS
App/Controller/Account/UsersController::forgotPassword()
Otra cosa para comprobar (especialmente si está trabajando con una VM) es si se ha cambiado el nombre de un archivo, pero todavía existe en el formulario original. p.ej. fooMapper.php renombrado a FooMapper.php (por ejemplo, a través de la actualización de SVN), su IDE detecta el nuevo archivo y lo envía a la VM. Ahora tiene ambas versiones en su máquina virtual, incluso si su IDE localmente solo muestra una. Tener cuidado.
Respuesta general para resumir este problema:
Este mensaje de error normalmente apunta a un problema con la carga automática y / o requiere instrucciones.
Durante la generación de informes de cobertura de código, phpunit require
cada *.php
que esté en <whitelist>
. Esto se puede desactivar utilizando addUncoveredFilesFromWhitelist=false
como parámetro, pero se recomienda mantenerlo activado.
Posibles razones
Lo que suele ocurrir en estos casos es que uno de los archivos tiene una declaración require
que requiere una clase ya cargada de nuevo (ya que no es require_once).
Otras razones pueden ser
- la definición duplicada de clases (una para depurar una para la producción, debe resolverse por herencia, no cargando el archivo php correcto)
Capitalización inconsistente que conduce a errores en el código php como:
if( !$classesLoaded[''ThIsClass'']) require_once(...);
en lugares múltiples con diferentes capitalizaciones.- La clase no se cargó en absoluto en las pruebas, pero se creó un objeto simulado con el nombre de la clase cargada. Esos pueden colisionar y conducir a ese error también
Una solución rápida puede ser agregar una declaración if al comienzo de su declaración de clase para evitar la redeclaración al ejecutar phpunit (si, y solo si, esa es la única clase con la que tiene problemas)
if (!class_exists("class_name")) {
// declare the class
class class_name
{
//...
}
}