使用PHPUnit时,全局变量为null
我正在将PHPUnit测试放在一个现有的项目中。全局常量变量被广泛使用。在我的单元测试中,函数失败是因为全局变量为null。下面是一个失败测试的示例使用PHPUnit时,全局变量为null,php,phpunit,Php,Phpunit,我正在将PHPUnit测试放在一个现有的项目中。全局常量变量被广泛使用。在我的单元测试中,函数失败是因为全局变量为null。下面是一个失败测试的示例 static $secret_key = "a secret Key"; class secret_key_Test extends PHPUnit_Framework_TestCase { function test_secret_key() { global $secret_key; $this
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;
没有成功地备份到类声明。您应该要求phpunit不要备份全局文件
protected $backupGlobals = FALSE;
正如S.伯格曼的原始文章所说:这个答案行不通。我问了一个几乎相同的问题,最后得到了一个更有意义的答案;无法覆盖PHPUnit将看到的测试类中的受保护属性$backupGlobals。如果您在命令行上运行,那么似乎可以通过创建一个xml配置文件并将backupGlobals设置为false来让Globals工作 编辑:在使用PHPUnit时,您需要声明$secret_key并在全局空间中为其赋值。PHP默认将全局初始化的变量放入全局名称空间,但PHPUnit在备份全局变量时会更改此默认值 需要进行以下更改:
global $secret_key; // Declaring variable global in global namespace
$secret_key = "a secret Key"; // Assigning value to global variable
您的代码现在应该可以工作了。您必须在引导测试时设置全局变量。下面是我如何编写测试的示例代码
/**
* Class to allow us set product on the fly
*/
class Product
{
public function __call($method, $args)
{
if (isset($this->$method)) {
$func = $this->$method;
return call_user_func_array($func, $args);
}
}
}
/**
* UssdShortcode Tester
*/
class ShortCodeTester extends WP_UnitTestCase {
protected $product;
public function setUp()
{
$this->product = new Product;
$this->product->get_id = function(){ return 50; };
$GLOBALS['product'] = $this->product;
}
/**
* A single example test.
*/
function test_it_can_display_ussd_shortcode() {
$displayer = new UssdShortCodeDisplayer;
$expected = view('show-product-short-code',['product_id' => $this->product->get_id() ]);
$results = $displayer->display($this->product->get_id());
// $this->assertRegexp('/'.$expected.'/', $results);
$this->assertEquals($expected,$results);
}
}
呵呵,全局变量是你在开始单元测试时应该去掉的,因为隔离和状态。顺便说一下,你可能想说
global$secret\u key=“a secret key”
不是静态的,不是吗?应该删除静态的关键字global
仅在函数/方法内部有意义。@zerkms是的,不应使用全局变量,但不幸的是,phpunit还删除本地启动的变量(在特定的单元测试类中受保护)。这是错误的,应由开发人员决定通过setUp()和tearDown()清除哪些变量。例如,当我测试web服务时,我只需要一个登录名,我想在许多测试中重用它——但phpunit总是删除启动的实例,并强制我多次进行身份验证。这是错误的。@lubosdz:这是隔离,或者确保它们在引导过程中由bootstrap.php
或它在PHPUnit开始执行实际测试方法之前加载的某个模块设置。@rp90:上面的代码包含奇怪的static
,您还没有解释static
是关于解决我的问题的。我正在使用PHPv7.3.0和PHPUnit 7.3.5。谢谢!