1. ホーム
  2. php

[解決済み】PHPUnitでprotectedメソッドをテストするためのベストプラクティス

2022-03-26 14:32:01

質問

でのディスカッションを見つけました。 プライベートメソッドのテストは行っていますか? は参考になります。

私は、いくつかのクラスで、protectedメソッドを持ち、それらをテストすることにしました。 これらのメソッドのいくつかは、静的で短いものです。ほとんどのパブリックメソッドはそれらを使用しているので、私はおそらく後でテストを安全に削除することができます。しかし、TDDアプローチを開始し、デバッグを避けるために、私は本当にそれらをテストしたいのです。

を思いつきました。

  • メソッドオブジェクト でアドバイスしているように 回答 はやりすぎのような気がします。
  • パブリックメソッドから始めて、上位のテストによってコードカバレッジが得られるようになったら、それらをprotectedにしてテストを削除します。
  • テスト可能なインターフェイスを持つクラスを継承し、protected メソッドを public にする。

どれがベストプラクティスですか?他に何かありますか?

JUnitは自動的にprotectedメソッドをpublicに変更しているようですが、深く見ていません。PHPでは リフレクション .

どのように解決するのですか?

PHP5 (>= 5.3.2) と PHPUnit を使っている場合、テストを実行する前にリフレクションを使って private や protected のメソッドを public に設定することで、そのメソッドをテストすることができます。

protected static function getMethod($name) {
  $class = new ReflectionClass('MyClass');
  $method = $class->getMethod($name);
  $method->setAccessible(true);
  return $method;
}

public function testFoo() {
  $foo = self::getMethod('foo');
  $obj = new MyClass();
  $foo->invokeArgs($obj, array(...));
  ...
}