PHPのtrait
のユニットテストを書く方法です。
public関数
以下のようなtrait
のpublic
な関数を考えます。
<?php
trait SomeTrait
{
public function greet(): string
{
return 'hello';
}
}
trait
を取り込んだテスト用のクラスを作ることでテストができます。
class TestTraitClass
{
use SomeTrait;
}
-----
// チェック
$SUT = new TestTraitClass();
self::assertEquals('hello', $SUT->greeet());
もしくは、無名クラスでもOK。
$SUT = new class() { use SomeTrait; };
self::assertEquals('hello', $SUT->greeet());
protected関数
以下のように、テストしたいメソッドがprotected
な関数のときは一工夫が必要です。
<?php
trait SomeTrait
{
protected function protectedGreet(): string
{
return 'hello';
}
}
やることとしては、trait
を取り込んだテスト用のクラスを作る時に、trait
のメソッドをpublic
でオーバーライドします。
皆れない構文ですが、trait
をuse
するときに{}
で囲うことで、trait
のメソッドに別名をつけることができます。
あとは、テストしたいメソッドと同名のメソッドをpublic
で定義し、別名をつけたprotected
なtrait
のメソッドに処理を委譲すればOKです。
class TestTraitClass
{
use SomeTrait {
protectedGreet as protected traitMethod;
};
public function protectedGreet(): string
{
return $this->traitMethod();
}
}
終わりに
protected
関数をテストしたくなること自体どうなの?って気持ちはあるけど、知ってて損はないかも。