10

私はPHP5.2.9を使用したPHPUnitのアプリケーションを学習および調査しており、グローバル問題に遭遇しました。$ backupGlobalsをFALSEに設定し、ドキュメント「@backupGlobalsdisabled」を含めました。これはPHPUnitのグローバルのバックアップの動作に影響を与えないようです。足りないものはありますか?PHPUnitのxmlファイルを変更する必要がありますか?ブートストラップを作成しますか?

config.php:

$testString = 'Hello world!';

basicApp.php:

require ('D:\data\clients\security.ca\web_sites\QRASystems.com\wwwroot\__tests\BasicApp\config.php');

class BasicApp {

public $test;

public function __construct() {
    global $testString;
    $this->test = $testString;
}

public function getTest() {
    return $this->test;
}

public function setTest($test){
    $this->test = $test;
}

BasicAppTest.php:

require ('D:\data\clients\security.ca\web_sites\QRASystems.com\wwwroot\__tests\BasicApp\BasicApp.php');

class BasicAppTest extends PHPUnit_Framework_TestCase{
    protected $testClass;
    protected $backupGlobals = FALSE;
    protected $backupGlobalsBlacklist = array('testString');

    public function SetUp(){
        $this->testClass = new BasicApp;
        $this->testClass->bootstrap();
    }

    public function testGlobal(){
        echo $this->testClass->getTest();
        $this->assertNotNull($this->backupGlobals);
        $this->assertFalse($this->backupGlobals);
        $this->assertNotEmpty($this->testClass->test);
    }

    public function testMethods(){
        $this->testClass->setTest('Goodbye World!');
        echo $this->testClass->getTest();
        $this->assertNotNull($this->backupGlobals);
        $this->assertNotNull($this->testClass->test);
        if (empty($this->testClass->test)) echo 'Method set failed!';
    }
}

testGlobal()は$ this-> assertNotEmpty($ this-> testClass-> test)で失敗し、$ this-> backupGlobalsがFALSEに設定されており、グローバルがまだPHPUnitによってバックアップされていることを示します。

編集:私は次の変更を加えることでこれを機能させました-

BasicAppTest.php:

    protected $backupGlobals = FALSE; <- REMOVED
    protected $backupGlobalsBlacklist = array('testString');  <- REMOVED

config.php:

global $testString; <- ADDED
$testString = 'Hello world!';

これがどこかでカバーされていなかったことに私は唖然としました!

4

2 に答える 2

10

テストケースでは、PHPUnitが認識しない新しいプロパティを定義しています。 $backupGlobalsプロパティは保護されているため、コンストラクターで設定できますがfalse、PHPUnitはコンストラクターを使用して、テストメソッドの実行方法に関する情報を渡します。代わりに、phpunit.xml構成ファイルbackupGlobalsを作成して、プロパティをに設定しますfalse

<phpunit backupGlobals="false">
    <testsuites>
        <testsuite name="Test">
            <directory>.</directory>
        </testsuite>
    </testsuites>
</phpunit>
于 2012-03-12T20:41:56.383 に答える
2

編集とコメントで、問題の1つの回避策を指摘しました(テストされたアプリケーション内でグローバルを明示的に宣言します)。PHPUnitの問題に対するonlabのコメントで、彼は動作を説明しています。関数にファイルを含めると、PHPは含まれているファイルのグローバルを関数のスコープに入れます。PHPUnitは関数にファイルをロードし、グローバルを抽出しようとしますが、私が試した場合は失敗します。

残念ながら、最小限のテストケースではレガシーシステムの問題を再現できなかったため(そして、あなたの問題を理解するのに苦労しました)、説明を実際に確認することはできません。--bootstrapしかし、彼が提案した回避策は私を助けてくれました。オプションを使用してブートストラップファイルを提供します。その中で、アプリケーションのテストされた部分で使用されるすべてのグローバルを宣言します。これにより、アプリケーションをテストするためにアプリケーションを変更する必要がなくなります。GitHubからのonlabの例を次に示します。

phpunit --bootstrap bootstrap.php test-path

bootstrap.php

global $my, $system, $globals, $here;
require_once("/path/to/my/system/bootstrap.php");
于 2014-05-09T22:48:34.903 に答える