如何通过反思得到模拟特征的私有财产?

时间:2017-04-05 14:59:47

标签: php reflection phpunit traits

Trait看起来像这样:

trait A{

    private $model;

    public function __construct($model){
        $this->model = $model;
        $this->methodToStub();    
    }
...
}

当我尝试在单元测试中获得带有反射的模拟特征的$ model属性时:

$mock = $this->getMockForTrait(A::class,[],'MockedTrait', false, true, true, ['methodToStub']);
$mock->expects($this->exactly(1))->method('methodToStub');
$mock->__construct('model');

$reflection = new \ReflectionClass(A::class);
$property = $reflection->getProperty('model');
$property->setAccessible(true);
$value = $property->getValue($mock);

我收到此错误:

  

未定义的属性:MockedTrait :: $ model

任何想法,为什么?

1 个答案:

答案 0 :(得分:0)

我看到的问题是您尝试使用A特征的反射来访问MockedTrait :: $模型的值。但可能MockedTrait :: $模型的“签名”与A :: $ model的“签名”不同。

由于Mock对象类是在phpunit中使用eval声明的,因此MockedTrait类是可以访问的,你可以尝试类似下面的内容:

$reflection = new \ReflectionClass(MockedTrait::class);

这应该可行(可能)。