Можно ли смоделировать защищенное свойство с помощью PHP Mockery?
У меня есть класс с методом, я назову его `a ‘, который делает магию над массивом, который извлекается из защищенного свойства из того же класса.
Это защищенное свойство заполняется другим методом b
, в том же классе.
Я хотел бы проверить метод a
высмеивая защищенное свойство, поэтому я не должен метод класса b
первый.
Так возможно ли это? Если нет, я должен рефакторинг своего кода? Или есть другие способы (учитывая лучшие практики).
Можно смоделировать защищенные методы, но, как указали некоторые люди, вы можете захотеть реорганизовать свой код, если вы чувствуете необходимость насмешки над этими методами.
Если вы хотите смоделировать защищенные методы, вы можете сделать это в соответствии с приведенным ниже примером:
$myMock = Mockery::mock('myClass')->shouldAllowMockingProtectedMethods();
Используя этот макет, тогда можно смоделировать защищенные методы так же, как вы бы издевались над публичными методами.
Иногда ваш код в порядке, и вы думаете, что нет причин менять код для облегчения тестирования (что, на мой взгляд, является хорошей причиной). Что я делаю, так это использую отражение в моем объекте, вы даже можете иметь вспомогательный метод, подобный этому :
class MockingHelpers
{
public static function mockProperty($object, string $propertyName, $value)
{
$reflectionClass = new \ReflectionClass($object);
$property = $reflectionClass->getProperty($propertyName);
$property->setAccessible(true);
$property->setValue($object, $value);
$property->setAccessible(false);
}
}
Обратите внимание, что доступное применяется только в контексте отражения, поэтому никакого ущерба не происходит.
Это не идеальное решение, иногда в вашем коде действительно может быть проблема, но это может вам помочь!