«Операции резервного копирования и восстановления статических атрибутов класса» в PHP - PullRequest
1 голос
/ 24 ноября 2010

Я видел эту фразу в документации PHPUnit:

Реализация резервного копирования и восстановить операции для статики Атрибуты классов требует PHP 5.3 (или больше). Реализация операции резервного копирования и восстановления для глобальные переменные и статические атрибуты классов использует serialize () и десериализации ()

Какова идея этого? Я имею в виду, я не использовал сериализацию и десериализацию для этой цели. Как именно эти так называемые операции «резервного копирования и восстановления» связаны со статическими атрибутами?

1 Ответ

3 голосов
/ 24 ноября 2010

Идея состоит в том, чтобы просто восстановить начальное известное состояние между тестами.Статические свойства по сути такие же, как глобальные переменные.Рассмотрим

class TestSubject
{
    public static $i = 0;
    public function __construct() { self::$i++; }
}

Теперь предположим, что вы создаете новые экземпляры TestSubject в методе настройки вашего теста.Поскольку статические свойства являются общими для всех экземпляров класса, TestSubject::i будет увеличиваться при каждом создании нового экземпляра.Это не будет сброшено.Это поддерживает его состояние во всем мире.Это нежелательно при модульных тестах, потому что для написания надежных тестов вам необходимо изолированное, воспроизводимое и известное состояние.Таким образом, защищенные элементы должны быть сброшены между тестовыми примерами, которые можно включить в PHPUnit с аннотацией @backupStaticAttributes.

Пример:

/**
 * @backupStaticAttributes enabled
 */
class Test extends PHPUnit_Framework_TestCase
{
    public function testInitialValueOfStaticMemberIsZero()
    {
        $this->assertSame(0, TestSubject::$i);
    }
    /**
     * @depends testInitialValueOfStaticMemberIsZero
     */
    public function testCreatingInstancesIncreasesStaticMember()
    {
        new TestSubject();
        new TestSubject();
        new TestSubject();
        $this->assertSame(3, TestSubject::$i);
    }
    /**
     * @depends testCreatingInstancesIncreasesStaticMember
     */
    public function testStaticMembersAreResetBetweenTests()
    {
        $this->assertSame(0, TestSubject::$i);
    }
}

Если удалить аннотацию, третьтест не пройден.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...