是否可以模拟受保护的属性和方法
是否可以使用 PHP Mockery 模拟受保护的属性?
我得到了一个带有方法的类,我称之为'a,它对从同一类的受保护属性中检索的数组执行一些魔术。
该受保护属性由同一类中的另一个方法填充。b
我想通过模拟受保护的属性来测试方法,这样我就不必先对方法进行分类。a
b
那么这可能吗?如果没有,我应该重构我的代码吗?或者还有其他方法(考虑最佳实践)。
是否可以使用 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);
}
}
请注意,可访问仅在反射上下文中应用,因此不会造成任何损坏。
这不是一个完美的解决方案,有时你的代码中可能真的有问题,但这可以帮助你!