PHPUnit: Выполнение утверждений для непубличных переменных

Предположим, у меня есть класс с частным свойством и связанным общедоступным средством получения и установки. Я хочу проверить с помощью PHPUnit, что свойство получает правильное значение после использования установщика или что получатель возвращает правильное свойство.

Конечно, я могу протестировать установщик, используя геттер, чтобы увидеть, что объект хранит правильное значение, и наоборот, для тестирования геттера. Однако это не гарантирует, что устанавливается частное свойство.

Допустим, у меня был следующий класс. Я создал свойство, геттер и сеттер.Но я допустил опечатку в имени свойства, поэтому геттер и сеттер на самом деле не манипулируют тем свойством, которым они должны управлять

class SomeClass
{
    private 
        $mane = NULL; // Was supposed to be $name but got fat-fingered!

    public function getName ()
    {
        return ($this -> name);
    }

    public function setName ($newName)
    {
        $this -> name = $newName;
        return ($this);
    }
}

. Если я выполню следующий тест

public function testSetName ()
{
    $this -> object -> setName ('Gerald');
    $this -> assertTrue ($this -> object -> getName () == 'Gerald');
}

, я бы прошел. Однако на самом деле случилось что-то очень плохое, чего я не хочу. Когда вызывается setName (), он фактически создает новое свойство в классе с именем, которое, как я думал, было у моего частного свойства, только то, которое создает установщик, является общедоступным! Я могу продемонстрировать это с помощью следующего кода:

$a  = new SomeClass;

$a -> setName('gerald');
var_dump ($a -> getName ());
var_dump ($a -> name);

Он выведет:

строка (6) «gerald»

строка (6) «gerald»

Есть ли способ получить доступ к частным свойствам из PHPUnit, чтобы я мог писать тесты, чтобы убедиться, что свойства, которые, как мне кажется, получаются и устанавливаются, действительно действительно получаются и устанавливаются?

Или есть что-то еще, что я должен сделать в тесте, чтобы выявить подобные проблемы, не пытаясь получить доступ к частному состоянию тестируемого объекта?

24
задан GordonM 19 January 2012 в 15:42
поделиться