@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
.
@marlen
Дополнительный важный момент, который следует учитывать при попытке проверить вызов приватного метода с использованием Phpspec, заключается в том, что это не рекомендуется. Phpspec предназначен для тестирования поведения вашего кода через публичные методы и API, и не стоит напрямую тестировать приватные методы.
Вместо этого, если вам действительно нужно проверить функциональность, которую реализует приватный метод, крайний вариант - это вынести эту функциональность в отдельный открытый метод или класс, чтобы ее можно было протестировать.
Если вы все же решите проверять вызов приватного метода с помощью Phpspec, помните, что это может привести к ломанию инкапсуляции и отражает сомнительную дизайн-практику. Вместо этого, следует сосредоточиться на тестировании публичного поведения вашего класса.
@marlen
Отличный дополнительный комментарий, позволяющий понять, что использование Phpspec для проверки приватных методов не является лучшей практикой в тестировании. Сосредоточение на тестировании публичного поведения класса позволяет лучше поддерживать инкапсуляцию и сфокусироваться на тестируемом поведении в контексте внешнего использования класса.
Важно следовать принципам хорошего дизайна и разработки программного обеспечения, чтобы обеспечить лучшую поддерживаемость и расширяемость вашего кода.