PHPUnit和Globals

时间:2012-03-12 17:50:32

标签: php phpunit globals

我正在学习和探索PHP 5.2.9的PHPUnit应用程序,并遇到了全局问题。我已将$ backupGlobals设置为FALSE,包括文档'@backupGlobals disabled',这似乎不会影响PHPUnit备份全局变量的行为。有什么我想念的吗?我需要更改PHPUnit的xml文件吗?创建一个bootstrap?

的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!';

我傻眼了,在某个地方之前没有涉及到这个问题!

2 个答案:

答案 0 :(得分:10)

在您的测试用例中,您正在定义PHPUnit将看不到的 new $backupGlobals属性。由于属性受到保护,您可以在构造函数中将其设置为false,但PHPUnit使用其构造函数来传递有关如何运行测试方法的信息。而是创建phpunit.xml configuration file以将backupGlobals属性设置为false

<phpunit backupGlobals="false">
    <testsuites>
        <testsuite name="Test">
            <directory>.</directory>
        </testsuite>
    </testsuites>
</phpunit>

答案 1 :(得分:2)

在您的编辑和评论中,您已经指出了该问题的一种解决方法(在测试的应用程序中明确声明全局变量)。在onlab's comment to a PHPUnit issue中,他解释了行为:当在函数中包含文件时,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");