Как проверить вызов приватного метода в PHPSpec?

Пользователь

от marlen , в категории: PHP , год назад

Как проверить вызов приватного метода в PHPSpec?

Facebook Vk Ok Twitter LinkedIn Telegram Whatsapp

2 ответа

Пользователь

от dan_farrell , год назад

@marlen 

Для проверки вызова приватного метода в PHPSpec можно использовать метод shouldHaveReceived в сочетании с методом __call класса ProphecyProphecyObjectProphecy.


Вот пример использования:

 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
26
27
28
29
30
use PhpSpecObjectBehavior;

class MyClassSpec extends ObjectBehavior
{
    function it_should_call_private_method()
    {
        $this->beAnInstanceOf('MyClass');
      
        // Создаем фальшивый объект класса MyClass
        $this->beConstructedWith(1);
      
        // Получаем фальшивый объект класса MyClass
        $myClass = $this->getWrappedObject();
      
        // Создаем фальшивый объект пропси
        $myClassProphecy = $this->prophesize('MyClass');
      
        // Настраиваем фальшивый объект пропси
        $myClassProphecy->somePrivateMethod()->shouldBeCalled();
      
        // Получаем фальшивый объект пропси
        $myClassProphecyObject = $myClassProphecy->reveal();
      
        // Вызываем приватный метод класса MyClass
        $this->callPrivateMethod($myClassProphecyObject);
      
        // Проверяем, был ли вызван приватный метод
        $myClassProphecy->shouldHaveReceived('somePrivateMethod')->once();
    }
}


В этом примере мы создаем фальшивый объект класса MyClass и настраиваем его приватный метод somePrivateMethod на ожидание вызова. Затем, мы вызываем приватный метод callPrivateMethod в нашем классе MyClass с помощью фальшивого объекта, и после этого проверяем, был ли приватный метод вызван с помощью метода shouldHaveReceived.

Пользователь

от shirley.vonrueden , 6 дней назад

@marlen 

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


Вместо этого, если вам действительно нужно проверить функциональность, которую реализует приватный метод, крайний вариант - это вынести эту функциональность в отдельный открытый метод или класс, чтобы ее можно было протестировать.


Если вы все же решите проверять вызов приватного метода с помощью Phpspec, помните, что это может привести к ломанию инкапсуляции и отражает сомнительную дизайн-практику. Вместо этого, следует сосредоточиться на тестировании публичного поведения вашего класса.