无法使用CodeCoverage和Composer重新声明类错误

时间:2013-01-10 01:19:32

标签: phpunit code-coverage autoload composer-php

使用Composer的autoload.php作为引导程序文件时,我遇到了PHPUnit Code_Coverage的错误。我创建了自己的boostrap.php文件,只需单独包含每个文件,一切正常。我偶然发现了一个Composer错误,或者我在某个地方犯了错误?

//编辑:我正在使用所有内容的最新版本(迄今为止):PHPUnit 3.7.12,Code_Coverage 1.2.7,Composer 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 个答案:

答案 0 :(得分:3)

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

故事的道德:始终仔细检查您的类和命名空间名称。

答案 1 :(得分:0)

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

我不确定你的意思是“单独包含每个文件”。你的意思是如果你不使用自动加载器但手动包含东西它有效吗?那会很奇怪。使用自动加载器通常可以正常工作。

如果所有其他方法都失败了,您是否可以尝试使用composer.json创建一个简单的重现案例,以及在运行phpunit时使其失败的几个类?

答案 2 :(得分:0)

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

我的猜测是,那里的东西包括一些东西。它也可能是已经自动加载的类的问题(iirc composer仅使用require而不是require_once(正确的!)再次包含。

到目前为止,弹出此错误的所有情况都是因为如果代码中包含include / require语句。如果情况并非如此,并且它可能,那么它在phpunit的某个地方是一个问题,但是很奇怪。

始终有效的是设置processUncoveredFileFromWhitelist="false",它仍将列出所有文件但不包括它们。未覆盖文件的覆盖范围信息会略有不同但很多。 (然后可以巧妙地猜测可执行的行数而不是从xdebug中获取)

相关问题