コールバック内で $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 に public としてアクセスしようとすると、次のようになります。
PHP Fatal error: Cannot access protected property (...)