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