private function をテストする
HogeClass の private function fuga($arg) をテストしたい場合
// fuga を _fuga にリネーム
runkit_method_rename(
'HogeClass',
'fuga',
'_fuga'
);
// public な fuga を追加し、fuga から _fuga をコールしてやります
runkit_method_add(
'HogeClass',
'fuga',
'$arg',
'return $this->_fuga($arg);'
);
PHP 5.3 以上の場合はこんなことしなくても ReflectionMethod で!
protected function をテストする
HogeClass の protected function fuga($arg) をテストしたい場合
これは runkit なくてもいけますね
// Wrapper を用意。extends した Class から親のメソッドをコールします
class HogeWrapper extends Hoge
{
public function fuga($arg) {return parent::fuga($arg);}
}
class HogeTest extends PHPUnit_Framework_TestCase
{
// HogeWrapper です
private $testClass;
// テストメソッドごとに 1 度ずつ実行
public function setUp()
{
// Wrapper を new してセット
$this->setTestClass(new HogeWrapper());
}
public function testFuga()
{
// テストする時は Wrapper を通して実行
$this->assertEquals(
'expectedValue',
$this->testClass->fuga()
);
}
}
テスト対象の Class にアクセサが無くてテストし辛い
マジックメソッド __get と __set を追加しています
// テスト前にテストデータをセットできるように
runkit_method_add(
'Hoge',
'__set',
'$member, $value',
'$this->$member = $value;'
);
// テスト後にメンバを取得して assertEquals など
runkit_method_add(
'Hoge',
'__get',
'$member',
'return $this->$member;'
);
runkit を利用した場合は他のテストに影響を及ぼさないように必要に応じて@runTestsInSeparateProcesses
か@runInSeparateProcess
を忘れずに付けています