如何在使用phpunitselenium进行测试时获取全局变量


how to get global variables while testing using phpunit-selenium

我在functions.php(phpbb)中有我的自定义函数testfunction_phpbb(),我想测试它。

function testfunction_phpbb()
{
global $user
...
...
...
//if valid user
return 1;
//else
return 0
}

当我执行下面的测试用例时,我发现$user总是空的(我没有得到全局上下文)。问题是,当我在phpbb、drupal、joomla等中测试函数时。当我通过phpunit+selenium进行测试时,如何获得上下文?

<?php
require_once './includes/functions.php';
class globaltest extends PHPUnit_Extensions_SeleniumTestCase
{
protected function setUp()
{
$this->setBrowser("*chrome");
$this->setBrowserUrl("http://localhost/");
}
public function testMyTestCase()
{
$this->open("/");
$this->click("link=phpBB3");
$this->waitForPageToLoad("30000");
$this->click("link=Login");
$this->waitForPageToLoad("30000");
$this->type("id=username", "admin");
$this->type("id=password", "admin123");
$this->click("name=login");
$this->waitForPageToLoad("30000");
$returnvalue = testfunction_phpbb();
PHPUnit_Framework_Assert::assertEquals('1',$returnvalue);
}
}
?>
正如您所发现的,全局变量破坏单元测试。出于这个原因,它们是一个坏主意,通常接受的解决方案是:
  • 重写代码以使用依赖项注入,这样$user变量就可以作为参数传入(然后可以作为测试的一部分传入一个伪变量)
  • 使用PHPUnit的支持来备份和模拟全局变量

我通常会选择依赖注入方法,因为这样做会容易得多。然而,如果你使用的是一个框架,你可能会被全局变量卡住,所以第二个选项是你的最佳选择。