您可以在回调中使用 $this 来获取 phpunit 中模拟类的受保护属性吗?或者还有其他方法可以实现吗?
$mock = $this->getMock('A', array('foo'));
$mock->expects($this->any())->method('foo')->will(
$this->returnCallback(function() {
return $this->bar;
}));
如果您考虑注入模拟对象,这可能非常有用。有时类对其他类具有硬编码的依赖关系,但它使用您理论上可以模拟并创建模拟对象而不是硬编码对象的方法创建它。请看另一个例子。
class A {
protected $bar = "bar";
public function foo () {
$b = new B();
return $b->fizz($this->bar);
}
}
class B {
public function fizz ($buzz) {
return $buzz;
}
}
但是让我们说 B 类做的不好,我想用模拟来代替它。
$mockB = $this->getMock('B');
// (...) - and probably mock other things
$mockA = $this->getMock('A', array('foo'));
$mockA->expects($this->any())->method('foo')->will(
$this->returnCallback(function() use ($mockB) {
return $mockB->fizz($this->bar);
}));
这在某种程度上可以实现吗?
当然,毫无疑问,目前,如果我像上面那样做,那么我会得到错误:
PHP Fatal error: Using $this when not in object context in (...)
使用use
关键字我可以从父范围继承 $mockA :
$mockB = $this->getMock('B');
// (...) - and probably mock other things
$mockA = $this->getMock('A', array('foo'));
$mockA->expects($this->any())->method('foo')->will(
$this->returnCallback(function() use ($mockA, $mockB) {
return $mockB->fizz($mockA->bar);
}));
但这样我会尝试以公共方式访问 bar ,我会得到:
PHP Fatal error: Cannot access protected property (...)