是否可以用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只应用于反射上下文中,因此不会造成损害。
这不是完美的解决方案,有时你的代码可能真的有问题,但这可以帮助你!