3

Composerのautoload.phpをブートストラップファイルとして使用すると、PHPUnitCode_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>
4

3 に答える 3

3

問題は、プロジェクトでの名前空間の使用にありました。私のプロジェクトの名前空間はC3\CDN\EdgeCast(EdgeCastの大文字の「C」に注意)ですが、テストファイルで名前空間を使用したときに誤って入力しましたuse C3\CDN\Edgecast;(Edgecastの小文字の「c」に注意してください)。名前の違いにより、CodeCoverageまたはComposer(正確にはどちらかはわかりません)は、クラスが含まれていないと考え、再度含めることを試みました。

話の教訓:クラス名と名前空間名を常に再確認してください。

于 2013-01-11T00:38:03.773 に答える
0

プロジェクトにもphpunitがcomposerと一緒にインストールされていますか?もしそうなら、おそらくphpunitを呼び出すことですでに含まれているので、ブートストラップを削除したいと思うでしょう。

「各ファイルを個別に含める」とはどういう意味かわかりません。オートローダーを使用せずに手動で含める場合は機能しますか?それはかなり奇妙だろう。オートローダーの使用は一般的に正常に機能します。

他のすべてが失敗した場合、composer.jsonと、phpunitの実行時に失敗するいくつかのクラスを使用して、単純な再現ケースを作成してみてください。

于 2013-01-10T08:27:20.140 に答える
0

processUncoveredFileFromWhitelist="true"インクルードは、PHPUnitsrcがカバレッジ情報を持たないすべてのファイルをインクルードする処理ステップ中に行われます。

私の推測では、そこにあるものには何かが含まれていると思います。また、すでに自動ロードされているクラスの問題である可能性もあります(iirc composerは使用するだけrequireで、 (当然のrequire_onceことながら)再び含まれていません)。

これまでのところ、このエラーが表示されるのは、コードにステートメントが含まれている/必要な場合が原因でした。そうでない場合、そしてそれが可能である場合、それはphpunitのどこかの問題ですが、非常に奇妙な問題です。

常に機能するのはprocessUncoveredFileFromWhitelist="false"、すべてのファイルを一覧表示するが、それらを含めない設定です。カバーされていないファイルのカバレッジ情報は少し異なりますが、大きく異なります。(実行可能な行数は、xdebugから取得するのではなく、賢く推測されます)

于 2013-01-10T15:10:25.203 に答える