CakePHP 1.3 + SimpleTestでグローバル関数をMock化するためのラッパークラスを作ってみました。libs/ に置いて使用します。
次のように任意の関数を呼び出せます。
//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 など)は使用できません。