グローバル関数のMockを作る

CakePHP 1.3 + SimpleTestでグローバル関数をMock化するためのラッパークラスを作ってみました。libs/ に置いて使用します。

global_function.php – gist

次のように任意の関数を呼び出せます。

//bootstrap.php 等で読み込んでおく
App::import('Lib', 'GlobalFunction');
 
GlobalFunction()->env('REMOTE_ADDR');
GlobalFunction()->gethostbyname('example.com');

テストケースでMockを使用したいとき、GlobalFunction::registerMock を呼び出します。戻り値はMockオブジェクトです。

function testRegisterMock() {
    //使用する関数名を引数に渡す
    $mock = GlobalFunction::registerMock('env', 'gethostbyname');
 
    //通常のmockと同様に使用できる
    $returnValue = '192.168.0.1';
    $mock->expectOnce('env', array('REMOTE_ADDR'));
    $mock->setReturnValue('env', $returnValue, array('REMOTE_ADDR'));
    $mock->expectNever('gethostbyname');
 
    $this->assertEqual($returnValue, GlobalFunction()->env('REMOTE_ADDR'));
 
    //ClassRegistry::flush を呼び出せば元に戻る
    ClassRegistry::flush();
 
    //本物の関数envが呼ばれる
    $addr = GlobalFunction()->env('REMOTE_ADDR');
}

注意:参照を引数に取る関数(array_push など)は使用できません。

Leave a Reply