是否可以模拟受保护的属性和方法


Is it possible to mock protected properties and methods

是否可以用PHP mock来模拟受保护的属性?

我有一个类,它有一个方法,我叫它' a,它对一个数组做了一些魔法,这个数组是从同一个类的一个受保护的属性中检索出来的。

这个受保护的属性是由同一个类中的另一个方法b填充的。

我想通过模拟受保护的属性来测试方法a,这样我就不必先对方法b进行分类了。

那么这是可能的吗?如果不是,我应该重构我的代码吗?或者是否有其他方法(考虑最佳实践)。

模拟受保护的方法是可能的,但是正如一些人指出的,如果您觉得需要模拟这些方法,您可能需要重构您的代码。

如果你想模拟受保护的方法,你可以按照下面的例子来做:

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

使用这个mock,就可以模仿受保护的方法,就像模仿公共方法一样。

有时候你的代码很好,你认为没有理由改变你的代码来方便测试(在我看来这是一个很好的理由),我所做的是在我的对象中使用反射,你甚至可以有一个像这样的辅助方法:

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

注意,accessible只应用于反射上下文中,因此不会造成损害。

这不是完美的解决方案,有时你的代码可能真的有问题,但这可以帮助你!