PHPUnit存储测试类的属性

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHPUnit存储测试类的属性相关的知识,希望对你有一定的参考价值。

我是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将在测试之间重置环境/为每个测试方法创建一个新的“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);
    }
}

随着@dependsdocs):

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);
    }
}

以上所有都应该通过。

EDIT必须删除@backupGlobals解决方案。这是完全错的。

另一答案

通常,您希望避免一个测试影响另一个测试。这确保了测试是干净的并始终有效,而不是在test1创建的某些边缘情况下。

以上是关于PHPUnit存储测试类的属性的主要内容,如果未能解决你的问题,请参考以下文章

如何使用PHPUnit测试一个方法调用了同一个类的其他方法,但是没有返回值

为啥我在测试创建相同类的 phpUnit 静态方法后得到“无法加载模拟 MyClassConsumer,类已存在”?

PHPUnit 模拟一个抽象类的所有方法

无法测试事件是不是具有 Laravel 5 和 PHPUnit 的属性

来自另一个类的 PHPUnit 模拟方法

Laravel 和 phpunit - 无法进行测试