No.436
【CakePHP】privateyやprotected関数のテスト
privateとかprotectedな関数のテスト方法
よく聞かれる質問
privateやprotectedの関数はクラス外から呼び出せない。じゃあテスト書けないじゃん。
回答用テンプレ
ReflectionClassを使えば書けるよ。
invoke()
書くの面倒くさいけど頑張ってね。
他にはクラスメソッドとしてprivateやprotectedの関数をwrappするpublicな関数を作成する方法もあるけど、まあ…ちょっとね…
※CakePHP3、CakePHP4共通
ReflectionClassの使用例
大まかな流れは下記となる。
- ReflectionClassでクラスのreflectionを取得。
getMethod()
でクラスメソッドのreflectionを取得。invoke()
でreflectionメソッドを実行。
クラスメソッドの引数の数だけ invoke()
時に引数を渡してあげることに注意。
use ReflectionClass;
use YourClass;
$class = new YourClass();
$reflection = new ReflectionClass($class);
$method = $reflection->getMethod('methodName');
$method->setAccessible(true);
$result = $method->invoke($class, $argument1, $argument2, ...);
$expected = 'xxxx';
$this->assertEquals($expected, $result);