我是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都会清除新属性吗?是否可以在测试中设置属性,以便在同一测试类的其他测试中可以访问该属性?

最佳答案

您正在testFirst()方法内设置foo属性。 PHPUnit将重置测试之间的环境/如果每个测试方法都没有@depends批注,则为每个测试方法创建一个新实例“NewTest”),因此,如果要将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解决方案。这是完全错误的。

10-05 22:52
查看更多