2013-01-10 101 views
2

当使用Composer的autoload.php作为引导文件时,我收到PHPUnit Code_Coverage的错误。我创建了我自己的boostrap.php文件,并且简单地包含每个文件,并且一切正常。我偶然发现了一个Composer错误,或者我在某处出错了吗?无法用CodeCoverage和Composer重新声明类错误

//编辑:我使用的是最新的(最新的)一切的版本:PHPUnit的3.7.12,Code_Coverage 1.2.7,作曲家b51a4a7

Fatal error: Cannot redeclare class C3\CDN\EdgeCast in /Users/kperrine/Projects/edgecast-custom-reports/src/C3/CDN/EdgeCast.php on line 11 

Call Stack: 
    0.0017  641760 1. {main}() /Applications/MAMP/bin/php/php5.3.14/bin/phpunit:0 
    0.2232 1111312 2. PHPUnit_TextUI_Command::main() /Applications/MAMP/bin/php/php5.3.14/bin/phpunit:46 
    0.2232 1112040 3. PHPUnit_TextUI_Command->run() /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/TextUI/Command.php:129 
    0.3027 4636952 4. PHPUnit_TextUI_TestRunner->doRun() /Applications/MAMP/bin/php/php5.3.14/lib/php/PHPUnit/TextUI/Command.php:176 
    21.5764 6604032 5. PHP_CodeCoverage_Report_HTML->process() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/phpunit/PHPUnit/TextUI/TestRunner.php:384 
    21.5764 6604240 6. PHP_CodeCoverage->getReport() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/HTML.php:120 
    21.5768 6663512 7. PHP_CodeCoverage_Report_Factory->create() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php:158 
    21.5769 6663512 8. PHP_CodeCoverage->getData() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage/Report/Factory.php:64 
    21.5769 6663512 9. PHP_CodeCoverage->addUncoveredFilesFromWhitelist() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php:190 
    21.5769 6664408 10. PHP_CodeCoverage->processUncoveredFileFromWhitelist() /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php:535 
    21.5778 6757272 11. include_once('/Users/kperrine/Projects/edgecast-custom-reports/src/C3/CDN/EdgeCast.php') /Users/kperrine/Projects/edgecast-custom-reports/vendor/phpunit/php-code-coverage/PHP/CodeCoverage.php:558 

我phpunit.xml是:

<?xml version="1.0" encoding="UTF-8"?> 
<phpunit backupGlobals="false" 
     backupStaticAttributes="false" 
     bootstrap="vendor/autoload.php" 
     colors="true" 
     convertErrorsToExceptions="true" 
     convertNoticesToExceptions="true" 
     convertWarningsToExceptions="true" 
     processIsolation="false" 
     stopOnFailure="false" 
     syntaxCheck="false" 
> 
    <testsuites> 
     <testsuite name="C3 EdgeCast Tests"> 
      <directory>./tests/</directory> 
     </testsuite> 
    </testsuites> 

    <filter> 
     <whitelist processUncoveredFilesFromWhitelist="true"> 
      <directory suffix=".php">src</directory> 
     </whitelist> 
    </filter> 

    <logging> 
     <log type="coverage-html" target="log/report" charset="UTF-8" 
      highlight="false" lowUpperBound="35" highLowerBound="70"/> 
    </logging> 
</phpunit> 

回答

3

问题在于我在项目中使用名称空间。我的项目命名空间是C3\CDN\EdgeCast(注意EdgeCast中的大写'C'),但是当我在测试文件中使用命名空间时,我意外地键入了use C3\CDN\Edgecast;(注意Edgecast中的小写'c')。名称的差异导致CodeCoverage或Composer(我不知道究竟是哪一个)认为该类没有被包含在内,因此试图再次包含它。

道德故事:总是仔细检查你的类和命名空间名称。

+0

同样的事情发生在我身上,因为我的一个班级名称中有一封信的错误情况。 –

0

phpunit是否与作曲家一起安装在项目中?如果是这样,你可能想删除引导程序,因为它已经通过调用phpunit包含在内。

我不确定你的意思是“简单地包含每个文件单独”。你的意思是如果你不使用自动加载器,但手动包含东西,它的工作原理是什么?那会很奇怪。使用自动加载器一般工作正常。

如果一切都失败了,你可以尝试使用composer.json和一些类来创建一个简单的重现案例,这会在phpunit运行时失败吗?

+0

不,PHPUnit单独安装在机器上。通过“简单包含每个文件”我的意思是我创建了一个bootstrap.php文件,其中包含以下代码覆盖工作就好了。 需要“path/to/file1.php”; 需要“path/to/file2.php”; 需要“path/to/fileN.php”; –

0

包含在processUncoveredFileFromWhitelist="true"的处理步骤中进行,其中PHPUnit包含src中没有覆盖信息的所有文件。

我的猜测是那里有东西会包括东西。这也可能是与已经自动加载类的问题(IIRC作曲家只使用require而不是require_once(理所当然尽管!)再次被包括在内。

在所有情况下,到目前为止,其中这个错误弹出,这是因为如果包括/需要在代码中的声明。如果不是这样,它的OFC可能的,那么它的PHPUnit,但一个相当奇怪的是一个问题的地方。

什么东西的工作原理是设置processUncoveredFileFromWhitelist="false"将仍然列出所有文件,但不包括它们,未覆盖文件的覆盖率信息会有所不同(但可执行代码的数量会巧妙地被猜到,而不是从xdebug中获取)

+0

是的,我将processUncovered转换为false,但是它没有得到代码覆盖权**,所以这不是一个选项。 src目录中的额外要求是我的第一个想法,但我完全通过了它,并且在任何地方都没有要求使用该代码。 –

+0

有趣。它应该猜得相当正确(而且这只适用于未覆盖的文件)。如果你有很多样品,那么我会对一个错误报告感兴趣,如果你有时间的话:) – edorian

+0

我刚刚重新检查过它,是的,在这种情况下,由于不正确命名空间(请参阅我自己对此问题的回答)。如果我将processUncovered设置为false,并使名称空间不正确,那么我只能得到1.5%的覆盖线。但是,一旦名称空间得到纠正,并且我仍然保持虚假,覆盖的行数将跳至53.44%。这与processUncovered设置为true时返回的百分比相同,因为所有文件都被测试发现。 –

相关问题