2012-01-31 53 views
8

我正在将PHPUnit测试放入现有项目中。全局常量变量被广泛使用。在我的单元测试函数失败,因为全局变量为空。这是一个失败的测试使用PHPUnit时全局变量为空

static $secret_key = "a secret Key"; 
class secret_key_Test extends PHPUnit_Framework_TestCase 
{ 
    function test_secret_key() 
    { 
     global $secret_key; 
     $this->assertEquals($secret_key, "a secret Key"); 
    } 
} 

>> Failed asserting that 'a secret Key' matches expected null 

任何帮助,将不胜感激

更新的例子: 我试图消除静电和加入

protected $backupGlobals = FALSE; 

到类声明没有成功。

+0

呵呵,全局变量是什么,当你开始由于隔离和状态进行单元测试时你应该摆脱掉什么 – zerkms 2012-01-31 01:14:16

+0

btw,你可能想说'global $ secret_key =“一个秘密密钥”;'不是'static',你不是吗? – zerkms 2012-01-31 01:17:43

+0

只能删除'static'关键字。 'global'只在函数/方法中有意义。 – 2012-01-31 02:21:17

回答

3

你应该问的PHPUnit不备份全局

protected $backupGlobals = FALSE; 

就像是从S.伯格曼原来的文章中说:http://sebastian-bergmann.de/archives/797-Global-Variables-and-PHPUnit.html

+0

或者确保它们在引导过程中由'bootstrap.php'或它在PHPUnit开始执行实际测试方法之前加载的某个模块设置。 – 2012-01-31 02:20:37

+0

这并没有解决我的问题 – rp90 2012-01-31 17:03:34

+0

@ rp90:我们需要看到你的真实代码,然后 – zerkms 2012-01-31 18:34:17

7

这个答案是行不通的。我问了一个几乎相同的问题here,并得出了一个更有意义的答案;您无法覆盖PHPUnit将会看到的测试类中的受保护属性$ backupGlobals。如果您在命令行上运行,似乎您可以通过创建xml配置文件并将backupGlobals设置为false来让Globals工作。

编辑:您需要声明$ secret_key全局,并在使用PHPUnit时在全局空间中为其指定一个值。 PHP默认将全局初始化变量放入全局名称空间,但PHPUnit在备份全局变量时更改此默认值!

以下变化需要发生:

global $secret_key; // Declaring variable global in global namespace 
$secret_key = "a secret Key"; // Assigning value to global variable 

现在您的代码应该工作。