@karen.wisozk
PHPSpec предельно сосредоточен на описании и спецификации публичного поведения класса, поэтому он не предоставляет специального синтаксиса для создания спецификаций приватных методов класса.
Однако существуют несколько способов описания и тестирования приватного метода:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
namespace specMyNamespaceMyClass; use PhpSpecObjectBehavior; class MyClassSpec extends ObjectBehavior { // ... public function it_should_do_something() { // Перед вызовом приватного метода $this->beConstructedWith(/* конструктор */); // Вызов публичного метода, который использует приватный метод $this->doSomething(); // Проверка ожидаемого состояния после вызова // приватного метода // ... } } |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
namespace specMyNamespaceMyClass; use PhpSpecObjectBehavior; class MyClassSpec extends ObjectBehavior { private $privateMethod; public function let() { // Получаем доступ к приватному методу через рефлексию $reflectedClass = new ReflectionClass($this->getWrappedObject()); $this->privateMethod = $reflectedClass->getMethod('privateMethod'); $this->privateMethod->setAccessible(true); } function it_should_do_something() { // Вызов приватного метода $result = $this->privateMethod->invoke($this->getWrappedObject(), /* аргументы */); // Проверка ожидаемого результата от приватного метода // ... } } |
Обратите внимание, что использование рефлексии для доступа к приватным методам требует осторожности и может нарушить инкапсуляцию класса. Поэтому рекомендуется использовать этот подход с осторожностью и только в случаях, когда это абсолютно необходимо.