首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >无法使用CodeCoverage和Composer重新声明类错误

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

Stack Overflow用户
提问于 2013-01-10 09:19:32
回答 3查看 1.3K关注 0票数 3

使用Composer的autoload.php作为引导文件时,我在使用PHPUnit Code_Coverage时遇到错误。我已经创建了自己的boostrap.php文件,并简单地分别包含了每个文件,一切都很正常。我是不是偶然发现了Composer bug,或者我在什么地方犯了个错误?

//编辑:我使用的都是最新的版本: PHPUnit 3.7.12,Code_Coverage 1.2.7,Composer b51a4a7

代码语言:javascript
复制
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是:

代码语言:javascript
复制
<?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>
EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-01-11 08:38:04

问题出在我在项目中使用名称空间。我的项目名称空间是C3\CDN\EdgeCast (注意Edgecast中的大写“C”),但是当我在测试文件中使用名称空间时,我不小心键入了use C3\CDN\Edgecast; (注意Edgecast中的小写“c”)。名称上的差异导致CodeCoverage或Composer (我不知道具体是哪一个)认为这个类没有被包括在内,因此试图再次包括它。

这个故事的寓意是:一定要仔细检查你的类名和命名空间名。

票数 3
EN

Stack Overflow用户

发布于 2013-01-10 16:27:20

项目中是否也安装了phpunit和composer?如果是这样,您可能希望删除引导程序,因为调用phpunit可能已经包含了该引导程序。

我不确定你所说的“简单地单独包含每个文件”是什么意思。你的意思是,如果你不使用自动加载器,而是手动添加一些东西,它可以工作吗?这将是非常奇怪的。使用自动加载器通常工作得很好。

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

票数 0
EN

Stack Overflow用户

发布于 2013-01-10 23:10:25

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

我的猜测是,其中的某些内容包含某些内容。这也可能是已经自动加载的类的问题(iirc composer只使用require,而不使用require_once )(这是正确的!)再次被包括在内。

到目前为止,在所有弹出此错误的情况下,都是因为代码中包含/要求语句。如果不是这样,而且ofc是可能的,那么这是phpunit中的一个问题,但却是一个非常奇怪的问题。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/14249339

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档