【问题标题】:Cannot redeclare class error with CodeCoverage and Composer无法使用 CodeCoverage 和 Composer 重新声明类错误
【发布时间】:2012-12-24 08:00:37
【问题描述】:

当使用 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>

【问题讨论】:

    标签: phpunit code-coverage autoload composer-php


    【解决方案1】:

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

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

    【讨论】:

    • 同样的事情发生在我身上,因为我的一个班级名称中的字母大小写错误。
    【解决方案2】:

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

    我的猜测是里面的某些东西包含了某些东西。这也可能是已经自动加载的类的问题(iirc composer 只使用require 而不是require_once(尽管如此!)被再次包含。

    到目前为止,出现此错误的所有情况都是因为代码中的 if include/require 语句。如果不是这种情况,而且有可能,那么这是 phpunit 中某个地方的问题,但很奇怪。

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

    【讨论】:

    • 是的,我将 processUncovered 切换为 false,但是它没有得到正确的代码覆盖率根本,所以这不是一个选项。 src 目录中的额外 require 是我的第一个想法,但我已经完全通过它并且在任何地方的代码中都没有 require。
    • 有趣。它应该猜得非常正确(而且这只适用于未发现的文件)。如果你有很多样本,如果你有时间,我会对错误报告感兴趣:)
    • 我刚刚重新检查了它,是的,由于命名空间不正确,在这种情况下它关闭了很多(请参阅我自己对这个问题的回答)。如果我将 processUncovered 设置为 false,并让命名空间不正确,我得到的行覆盖率仅为 1.5%。但是,一旦更正了命名空间,并且我仍然未覆盖为假,覆盖的行数将跃升至 53.44%。这与 processUncovered 设置为 true 时返回的百分比相同,因为所有文件都未被测试发现。
    【解决方案3】:

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

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

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

    【讨论】:

    • 不,PHPUnit 是单独安装在机器上的。 “简单地包括每个文件”是指我创建了一个 bootstrap.php 文件,其中包含以下内容,并且代码覆盖工作得很好。需要“路径/到/file1.php”;需要“路径/到/file2.php”;需要“路径/到/fileN.php”;
    猜你喜欢
    • 2018-03-12
    • 1970-01-01
    • 1970-01-01
    • 2023-04-02
    • 1970-01-01
    • 1970-01-01
    • 2012-01-29
    • 1970-01-01
    • 2017-12-10
    相关资源
    最近更新 更多