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

2022-08-30 23:20:19

是否可以使用 PHP Mockery 模拟受保护的属性?

我得到了一个带有方法的类,我称之为'a,它对从同一类的受保护属性中检索的数组执行一些魔术。

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

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

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


答案 1

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

如果您确实要模拟受保护的方法,则可以根据下面的示例执行此操作:

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

使用此模拟,可以像模拟公共方法一样模拟受保护的方法。


答案 2

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

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

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

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


推荐