PHPUnit kod kapsama rapor oluştururken sınıf hata Redeclare

3 Cevap php

Zend Framework 1.10 ve Doktrin 2 (b1) ile bir proje başlıyor. Ben kendi kütüphane kod ad kullanıyorum.

Kod kapsama raporlar oluşturulurken ben bir sınıf yeniden tanımlamak hakkında bir Ölümcül Hata olsun. (Çok fazla çıkış var çünkü özürlü yerel değişkenler çıkış) fonksiyon iz görebilirsiniz bu nedenle daha fazla bilgi sağlamak için, benim phpunit yürütülebilir xdebug_disable () çağrısı dışarı yorumladı ettik.

İşte benim Terminal çıkışı bulunuyor:

$ phpunit
PHPUnit 3.4.12 by Sebastian Bergmann.

........

Time: 4 seconds, Memory: 16.50Mb

OK (8 tests, 14 assertions)

Generating code coverage report, this may take a moment.PHP Fatal error:  Cannot redeclare class Cob\Application\Resource\HelperBroker in /Users/Cobby/Sites/project/trunk/code/library/Cob/Application/Resource/HelperBroker.php on line 93
PHP Stack trace:
PHP   1. {main}() /usr/local/zend/bin/phpunit:0
PHP   2. PHPUnit_TextUI_Command::main() /usr/local/zend/bin/phpunit:54
PHP   3. PHPUnit_TextUI_Command->run() /usr/local/zend/share/pear/PHPUnit/TextUI/Command.php:146
PHP   4. PHPUnit_TextUI_TestRunner->doRun() /usr/local/zend/share/pear/PHPUnit/TextUI/Command.php:213
PHP   5. PHPUnit_Util_Report::render() /usr/local/zend/share/pear/PHPUnit/TextUI/TestRunner.php:478
PHP   6. PHPUnit_Framework_TestResult->getCodeCoverageInformation() /usr/local/zend/share/pear/PHPUnit/Util/Report.php:97
PHP   7. PHPUnit_Util_Filter::getFilteredCodeCoverage() /usr/local/zend/share/pear/PHPUnit/Framework/TestResult.php:623

Fatal error: Cannot redeclare class Cob\Application\Resource\HelperBroker in /Users/Cobby/Sites/project/trunk/code/library/Cob/Application/Resource/HelperBroker.php on line 93

Call Stack:
    0.0004     322888   1. {main}() /usr/local/zend/bin/phpunit:0
    0.0816    4114628   2. PHPUnit_TextUI_Command::main() /usr/local/zend/bin/phpunit:54
    0.0817    4114964   3. PHPUnit_TextUI_Command->run() /usr/local/zend/share/pear/PHPUnit/TextUI/Command.php:146
    0.1151    5435528   4. PHPUnit_TextUI_TestRunner->doRun() /usr/local/zend/share/pear/PHPUnit/TextUI/Command.php:213
    4.2931   16690760   5. PHPUnit_Util_Report::render() /usr/local/zend/share/pear/PHPUnit/TextUI/TestRunner.php:478
    4.2931   16691120   6. PHPUnit_Framework_TestResult->getCodeCoverageInformation() /usr/local/zend/share/pear/PHPUnit/Util/Report.php:97
    4.2931   16691148   7. PHPUnit_Util_Filter::getFilteredCodeCoverage() /usr/local/zend/share/pear/PHPUnit/Framework/TestResult.php:623

(Iki kez hata gösterir neden ben ... hiçbir fikrim yok?)

Ve burada benim phpunit.xml olduğunu:

<phpunit bootstrap="./code/tests/application/bootstrap.php" colors="true">
    <!-- bootstrap.php changes directory to trunk/code/tests,
    all paths below are relative to this directory. -->

    <testsuite name="My Promotions">
        <directory>./</directory>
    </testsuite>

    <filter>
        <whitelist>
            <directory suffix=".php">../application</directory>
            <directory suffix=".php">../library/Cob</directory>
            <exclude>
                    <!-- By adding the below line I can remove the error -->
                <file>../library/Cob/Application/Resource/HelperBroker.php</file>
                <directory suffix=".phtml">../application</directory>
                <directory suffix=".php">../application/doctrine</directory>
                <file>../application/Bootstrap.php</file>
                <directory suffix=".php">../library/Cob/Tools</directory>
            </exclude>
        </whitelist>
    </filter>

    <logging>
        <log type="junit" target="../../build/reports/tests/report.xml" />
        <log type="coverage-html" target="../../build/reports/coverage" charset="UTF-8"
            yui="true" highlight="true" lowUpperBound="50" highLowerBound="80" />
    </logging>
</phpunit>

Ben bu sorunu gizlemek için dikişler içine bir etiket ekledik. Ben başka bir uygulama kaynak var ama bir sorun (diğeri Doktrini 2 kaynaktır) olması için dikiş yoktur. Bu sınıfa özgü neden emin değilim, benim tüm kütüphane yüzden herhangi onların değil, özdevinimli edilir / yerde aramaları gerektirir içerir. Ben HelperBroker kütüphane / Cob dışarı kaynaklanan dosya sisteminde ilk dosyası olduğunu belirtmek gerekir sanırım

Ben tüm yazılımların son / yeni sürümlerini (Zend Sunucu, Zend Framework, Doktrin 2 Beta1, Phing, PHPUnit, PEAR) ile Snow Leopard üzerinde duyuyorum.

3 Cevap

Bu sorunu tamamlamayı Genel cevap:

This error message usually points to a problem with auto loading and or require statements.

During code coverage report generation phpunit is requireing every *.php that is in <whitelist>. This can be turned off using addUncoveredFilesFromWhitelist=false as a parameter but it is recommended to keep this on.

Possible reasons

Bu durumlarda gerçekleşmesi eğilimi ne dosyalardan biri (bir require_once değil gibi) yine zaten yüklü sınıfı gerektiren bir require deyimi vardır olmasıdır.

Diğer nedenler olabilir

  • sınıfların yinelenen tanımı (üretim için bir hata ayıklama için bir, sağ php dosyası yükleyerek miras yoluyla değil, çözülmesi gereken)
  • Gibi php kod hataları neden tutarsız harf:

    if( !$classesLoaded['ThIsClass']) require_once(...);, farklı aktifleştirilenler ile birden fazla yerde.

  • Sınıf testlerinde tüm yüklü alıyorum ama sahte bir nesne daha sonra yüklenen sınıfın adı ile oluşturulan değildi. Bu çarpışır ve de bu hataya yol açabilir

Hızlı bir geçici çözüm (yani sorun yaşıyorsanız sadece sınıf, sadece ve sadece, eğer) phpunit çalışırken redeclaration önlemek için sınıf ilanının uzaklaştırmak bir if deyimi eklemek olabilir

if (!class_exists("class_name")) {
    // declare the class
    class class_name
    {
        //...
    }
}

(Eğer bir VM ile çalışıyorsanız özellikle) kontrol etmek için bir diğer şey bir dosya yeniden ama yine orijinal formda var olup olmadığıdır. örn. fooMapper.php FooMapper.php (örn. yoluyla SVN update) olarak isimlendirilecek, IDE yeni dosyayı algılar ve VM gönderir. Yerel olarak IDE sadece birini gösterilse bile artık VM hem versiyonları var. Dikkat.