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

时间:2015-08-13 02:54:06

标签: php mocking phpunit protected mockery

是否可以使用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进行分类。

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

2 个答案:

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

请注意,仅在反射上下文中应用了可访问性,因此不会造成任何损害。

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