PHPunitでテストを書いているとprotectedなメンバー変数、メソッドをどうやってテストしようか悩むときがあるでその方法を覚書。
まずは手段
- まっとうにやるならReflectionを使う
- クラスを継承してprotectedにアクセスできるようにする
- そもそもprotectedは使わないで実装する
1は正攻法、これができれば一番いいかもしれない。
でもうちの会社ではテストが分かりづらくなるから使わない方針になってしまっている。
3はないな、うん、ない。
ということで2の方法でやるとこにする。
クラスを継承してprotectedにアクセスできるようにする
この方法もGoogle先生に聞くといろいろ出てくる。
そこで一番簡単な方法が以下である。
php
class Hogehoge extends Hoge {
// メンバー変数にセット
public function __set($name, $value) {
return $this->$name = $value;
}
// メンバー変数取得
public function __get($name) {
return $this->$name;
}
// メソッドの呼び出し
public function __call($name, $args) {
return call_user_func_array( array($this, $name), $args);
}
}
Hogeクラスにprotectedなメンバー変数とメソッドがある想定ですが、
それを継承して上記をコピペすればpublicな感覚でアクセスすることができるようになります。
あとはHogehogeクラスでテストを書いていけばよいわけです。
久々にPHPのマジックメソッドいいね!と思えました。
ただ、これはprotectedに関してだけ使える方法なのでprivateは別の方法でアクセスできるようにする必要がある。