匿名类,访问扩展类的私有属性

时间:2018-05-07 17:01:20

标签: php

完全意识到像Mockery这样的东西存在,我试图看看PHPUnit中的哪些测试就像使用直接PHP一样。只有匿名类的出现才能实现这一点。我的工作完美,除非我想在我的扩展类中覆盖的属性是私有的,那么它当然会失败。以下是测试结果的一个小例子:

$test = new class() extends ClassImExtending {
        // user is protected in ClassImExtending, and its value is 
        // injected User
        public $user;

        public function __construct() {
            // Overwrites ClassImExtending constructor so that I don't 
            // have to inject all the same dependencies for the purpose 
            // of my test

            // By extending User, it forces any methods I'm overriding 
            // to accept the same number and type of arguments
            $this->user = new class() extends User {
                public function getUser() {
                    $user = new User;
                    $user->id = 1;
                    return $user;
                }
            };
        }
}

基本上,只要ClassImExtending中的属性$ user受到保护或公开,并且我正在测试的方法除了$ user之外不使用任何其他ClassImExtending属性,那么以下内容将很有用:

$result = $test->methodImTestingInClassImExtending();

但就像我之前说过的,如果$ user是私有的,methodImTestingInClassImExtending()当然甚至都不会查看我的匿名类覆盖属性$ user,它会在ClassImExtending中查看$ user,这当然是value为null,因为我的匿名类重写了类构造函数,其中$ user被赋予ClassImExtending中的值。

我一直在尝试使用Closures或任何类似的尝试,看看我是否可以使这个设置以某种方式访问​​我正在扩展的类的私有属性,以便我可以覆盖该值。我认识到这会破坏私有财产的目的,而不是典型的用例。但是为了测试我在单元测试的概念中做了什么......有没有人有任何想法或想法?

0 个答案:

没有答案