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 новые свойства после каждого выполнения теста? Есть ли способ задать свойство в тесте, чтобы оно было доступно в других тестах того же тестового класса?

Author: ROMANIA_engineer, 2011-03-15

2 answers

Вы устанавливаете свойство foo внутри метода testFirst(). PHPUnit сбросит среду между тестами/создаст новый экземпляр "NEWTest" для каждого метода тестирования, если у них нет аннотации @depends), поэтому, если вы хотите, чтобы foo было установлено в true, вам нужно воссоздать это состояние в зависимом тесте или использовать метод setup().

С setup() ( документы):

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 ( документы):

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. Это было просто неправильно.

 22
Author: Gordon, 2011-03-15 11:26:50
  • Вы можете использовать аннотацию @depends
  • Вы можете инициализировать что-то в методе Setup()

Как правило, вы хотите избежать того, чтобы один тест влиял на другой тест. Это гарантирует, что тест чист и всегда работает, а не в каком-то крайнем случае, который создает test1.

 4
Author: Sjoerd, 2015-11-12 07:39:17