LoginSignup
0

More than 5 years have passed since last update.

PHP 5.3 未満のシステムの単体テストを書く時によくやること (PHPUnit + runkit)

Last updated at Posted at 2018-03-14

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を忘れずに付けています

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0