Возможно ли издеваться над защищенными свойствами и методами

Можно ли издеваться над защищенным свойством с PHP Mockery?

Я получил класс с методом, я назову его "a", который делает некоторую магию в массиве, который извлекается из защищенного свойства из того же класса.

Это защищенное свойство заполняется другим методом b в том же классе.

Я хотел бы протестировать метод a, высмеивая защищенное свойство, поэтому мне не нужно сначала использовать метод класса b.

Так это возможно? Если нет, следует ли реорганизовать мой код? Или есть другие способы (с учетом передового опыта).

Ответ 1

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

Если вы хотите издеваться над защищенными методами, вы можете сделать это в соответствии с приведенным ниже примером:

$myMock = Mockery::mock('myClass')->shouldAllowMockingProtectedMethods();

Используя это издевательство, можно затем обмануть защищенные методы так же, как вы издеваетесь над общедоступными методами.

Ответ 2

Иногда ваш код в порядке, и вы считаете, что нет смысла изменять свой код, чтобы облегчить тесты (что, на мой взгляд, является хорошей причиной), то, что я делаю, - это использовать отражение внутри моего объекта, вы можете даже иметь вспомогательный метод, подобный этому:

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);
    }
}

Обратите внимание: доступность применяется только в контексте отражения, поэтому никакого ущерба не наносится.

Это не идеальное решение, иногда у вас может быть проблема в коде, но это может вам помочь!