使用Composer的autoload.php作为引导文件时,我在使用PHPUnit Code_Coverage时遇到错误。我已经创建了自己的boostrap.php文件,并简单地分别包含了每个文件,一切都很正常。我是不是偶然发现了Composer bug,或者我在什么地方犯了个错误?
//编辑:我使用的都是最新的版本: 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>发布于 2013-01-11 08:38:04
问题出在我在项目中使用名称空间。我的项目名称空间是C3\CDN\EdgeCast (注意Edgecast中的大写“C”),但是当我在测试文件中使用名称空间时,我不小心键入了use C3\CDN\Edgecast; (注意Edgecast中的小写“c”)。名称上的差异导致CodeCoverage或Composer (我不知道具体是哪一个)认为这个类没有被包括在内,因此试图再次包括它。
这个故事的寓意是:一定要仔细检查你的类名和命名空间名。
发布于 2013-01-10 16:27:20
项目中是否也安装了phpunit和composer?如果是这样,您可能希望删除引导程序,因为调用phpunit可能已经包含了该引导程序。
我不确定你所说的“简单地单独包含每个文件”是什么意思。你的意思是,如果你不使用自动加载器,而是手动添加一些东西,它可以工作吗?这将是非常奇怪的。使用自动加载器通常工作得很好。
如果所有其他方法都失败了,您是否可以尝试创建一个简单的重现案例,其中包含一个composer.json和几个类,使其在运行phpunit时失败?
发布于 2013-01-10 23:10:25
include是在processUncoveredFileFromWhitelist="true"的处理步骤中进行的,在该步骤中,PHPUnit包含src中没有覆盖率信息的所有文件。
我的猜测是,其中的某些内容包含某些内容。这也可能是已经自动加载的类的问题(iirc composer只使用require,而不使用require_once )(这是正确的!)再次被包括在内。
到目前为止,在所有弹出此错误的情况下,都是因为代码中包含/要求语句。如果不是这样,而且ofc是可能的,那么这是phpunit中的一个问题,但却是一个非常奇怪的问题。
始终有效的是设置processUncoveredFileFromWhitelist="false",它仍然会列出所有文件,但不包括它们。未覆盖文件的覆盖率信息将略有不同,但差别很大。(然后可以巧妙地猜测可执行的行数,而不是从xdebug中获取)
https://stackoverflow.com/questions/14249339
复制相似问题