我是PHPUnit的初学者。
这是我创建的示例测试类:
class NewTest extends PHPUnit_Framework_TestCase
{
protected $foo;
function testFirst ()
{
$this->foo = true;
$this->assertTrue($this->foo);
}
/**
* @depends testFirst
*/
function testSecond ()
{
$this->assertTrue($this->foo);
}
}
执行testSecond时,会抛出错误“Undefined property NewTest::$foo
”。
为什么会这样?每次测试执行后,PHPUnit都会清除新属性吗?有没有办法在测试中设置属性,以便在同一测试类的其他测试中可以访问它?
答案 0 :(得分:24)
您正在testFirst()
方法中设置foo属性。 PHPUnit将在测试之间重置环境/为每个测试方法创建一个新的“NewTest”实例(如果它们没有@depends注释),所以如果你想将foo
设置为true
您必须在依赖测试中重新创建该状态或使用setup()
方法。
setup()
(docs):class NewTest extends PHPUnit_Framework_TestCase
{
protected $foo;
protected function setup()
{
$this->foo = TRUE;
}
function testFirst ()
{
$this->assertTrue($this->foo);
}
/**
* @depends testFirst
*/
function testSecond ()
{
$this->assertTrue($this->foo);
}
}
@depends
(docs):class NewTest extends PHPUnit_Framework_TestCase
{
protected $foo;
function testFirst ()
{
$this->foo = TRUE;
$this->assertTrue($this->foo);
return $this->foo;
}
/**
* @depends testFirst
*/
function testSecond($foo)
{
$this->foo = $foo;
$this->assertTrue($this->foo);
}
}
以上所有内容都应该通过。
编辑 必须删除@backupGlobals解决方案。这是完全错误的。
答案 1 :(得分:4)
通常,您希望避免一个测试影响另一个测试。这确保了测试是干净的并始终有效,而不是在test1创建的某些边缘情况下。