Тестирование установки частного свойства: можем ли мы использовать макет, чтобы установить значение и отразить свойство, чтобы проверить, было ли установлено значение? - PullRequest
0 голосов
/ 26 апреля 2020

У меня есть как вопрос «как это сделать», так и «как это делается».

Class realClass {

     private $privateProperty;

     public function __construct($someArray, $someString) {
          // stuff
     }

     public function setProperty($someArray) {
          $this->privateProperty = $someArray;
     }
}


class testRealClass extends TestCase {

    // creating a mock because don't want to have tests depending on arguments passed to the constructor
    public function setUp(): void
    {
         $this->classToTest = $this->getMockBuilder(realClass::class)
             ->disableOriginalConstructor()
             ->setMethods(null)
             ->getMock();
    }

    // testing the set of the variable. In order to know if it was set, without using a getter,
    // we probably need to use reflection
    public function testSetPrivateProperty() {
         $this->classToTest->setProperty([1,2,3]);

         // This will not work as the property is private
         // echo $this->classToTest->privateProperty;

         // Reflecting the mock, makes sense? How does this work?
         $reflect = new \ReflectionClass($this->classToTest);
         $property = $reflect->getProperty('privateProperty');
         $property->setAccessible(true);
         var_dump($property->getValue($this->classToTest));
    }
}

При выполнении этого я получаю исключение ReflectionException: свойство privateProperty не существует.

Если я сделаю print_r из отражений-> getProperties, я смогу увидеть свойство там.

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

Это вообще имеет смысл, или это не сработает, потому что это просто неправильно?

Спасибо всем

(здесь написал код, так что если я пропускаю ";", "(", et c, игнорируйте его:)

1 Ответ

0 голосов
/ 27 апреля 2020

Использование Reflection API для тестирования редко является хорошей идеей. Однако реальный вопрос - зачем иметь частную собственность, если ничто не может получить к ней доступ? Очевидно, свойство используется в другом методе класса. Итак, чистое решение здесь - удалить весь код отражения, затем создать геттер в самом классе и заменить все вызовы на $this->property на $this->getProperty(), тогда вы можете легко проверить это.

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

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