答えは「あなたはしません」です。ユニットテストでは、各クラスを個別にテストする必要があります。そこで実行しようとしているのは、ユニットテストではありません。私のコメントで言ったように、あなたはデメテルの法則を破っています。
- 各ユニットは、他のユニットについての知識が限られている必要があります。現在のユニットに「密接に」関連しているユニットのみです。
- 各ユニットは、その友達とのみ話す必要があります。見知らぬ人と話をしないでください。
- 直接の友達とだけ話してください。
リファクタリングが必要なクラスが緊密に結合されています。ここでは、要点を説明するために最初にクラスを作成しましたが、通常は最初にテストを作成します。
チェーンの終わりから始めましょう:-
class there3
{
private $id
public function setId($id)
{
$this->id = $id;
}
public function getId()
{
return $this->id;
}
}
それでは、ユニットテストを設定しましょう:-
class there3Test extends PHPUnit_Framework_TestCase
{
public function testCanGetId()
{
$there3 = new there3();
$there3->setId(3);
$this->assertTrue($there3->getId() === 3);
}
}
そのクラスは現在テストされているので、再度テストする必要はありません。次のものを見てみましょう:-
class this2
{
public $there3;
//To facilitate unit testing we inject the dependency so we can mock it
public function __construct(there3 $there3)
{
$this->there3 = $there3;
}
public function getId()
{
return $this->there3->getId();
}
}
そして今、ユニットテスト:-
class this2Test extends PHPUnit_Framework_TestCase
{
public function testCanGetId()
{
$mockThere3 = $this->getMock('there3');
$mockThere3->method('getId')
->will($this->returnValue(3);
$this2 = new this2($mockThere3);//We pass in the mock object instead of the real one
$this->assertTrue($this2->getId() === 3);
}
}
私のポイントをさらに説明するために、最後の例を1つ実行します。-
class this1
{
private $this2;
public function __construct(this2 $this2)//injecting again
{
$this->$this2 = $this2;
}
public function getId()
{
return $this->$this2->getId();
}
}
そして、繰り返しますが、ユニットテスト:-
class this1Test extends PHPUnit_Framework_TestCase
{
public function testCanGetId()
{
$mockThis2 = $this->getMock('this2');
$mockThis2->method('getId')
->will($this->returnValue(3);
$this1 = new this1($mockThis2);//We pass in the mock object instead of the real one
$this->assertTrue($this1->getId() === 3);
}
}
うまくいけば、私があなたの例のすべてのオブジェクトを調べなくても、あなたはアイデアを得ることができます。
私がやったことは、クラスを互いに切り離すことです。彼らは依存しているオブジェクトについての知識しか持っておらず、そのオブジェクトが要求された情報をどのように取得するかは気にしません。
これで、idの呼び出しは次のようになります。-
public function getId()
{
return $this->this1->getId();
}
返されるIDがthere2::idになるまでチェーンを上っていきます。$ this-> $ this1-> $ this2-> there3-> idのようなものを書く必要はなく、クラスを適切に単体テストできます。
ユニットテストの詳細については、PHPUnitのマニュアルを参照してください。