Подтвердить что ты не робот

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

4b9b3361

Ответ 1

Вы устанавливаете свойство foo внутри метода testFirst(). PHPUnit будет reset средой между тестами/создаст новый экземпляр "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);
    }
}

Все вышеперечисленное должно пройти.

EDIT пришлось удалить решение @backupGlobals. Это было неправильно.

Ответ 2

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