No.436


【CakePHP】privateyやprotected関数のテスト

privateとかprotectedな関数のテスト方法

 よく聞かれる質問
 privateやprotectedの関数はクラス外から呼び出せない。じゃあテスト書けないじゃん。

 回答用テンプレ
 ReflectionClassを使えば書けるよ。  invoke() 書くの面倒くさいけど頑張ってね。

 他にはクラスメソッドとしてprivateやprotectedの関数をwrappするpublicな関数を作成する方法もあるけど、まあ…ちょっとね…

※CakePHP3、CakePHP4共通


ReflectionClassの使用例

 大まかな流れは下記となる。

  1. ReflectionClassでクラスのreflectionを取得。
  2. getMethod() でクラスメソッドのreflectionを取得。
  3. 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);