是否可以使用PHP Mockery模拟受保护的属性?
我得到了一个带有方法的类,我将其命名为“a”,它在从同一个类的受保护属性中检索的数组上做了一些魔术。
该受保护的属性由另一个方法$('form.p_form').submit(function (){
var description = $.trim($('#f9').val());
var aa = $.post("checkdescription.php",{
description: description
},
function(data, status){
return data['status'];
}
});
填充,在同一个类中。
我想通过模拟受保护的属性来测试方法b
,因此我不必首先对方法a
进行分类。
这可能吗?如果没有,我应该重构我的代码吗?或者还有其他方法(考虑最佳实践)。
答案 0 :(得分:18)
可以模拟受保护的方法,但正如有些人指出的那样,如果您觉得需要模拟这些方法,则可能需要重构代码。
如果您确实想要模拟受保护的方法,可以根据以下示例执行此操作:
$myMock = Mockery::mock('myClass')->shouldAllowMockingProtectedMethods();
使用这个模拟,然后可以像模拟公共方法一样模拟受保护的方法。
答案 1 :(得分:3)
有时您的代码很好,您认为没有理由更改代码以方便测试(这在我看来是一个很好的理由),我所做的是在我的对象中使用反射,你甚至可以有一个帮手像这样的方法:
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);
}
}
请注意,仅在反射上下文中应用了可访问性,因此不会造成任何损害。
这不是完美的解决方案,有时您的代码可能会遇到问题,但这可以帮助您!