Phakeを試してみます

テストしたいクラスがあるけど、依存クラスの実装が終わっていないとき。
そんな時にモックを使ってテストするアプローチです。

class Model
{
    public function login(Api $api, $id = 0)
    {
        $result = $api->auth($id);
        if ($result === 'OK'){
            return true;
        }

        return false;
    }
}

↑Modelクラスをテストしたいけど、↓のApiクラスは未実装

class Api
{
    public function auth($id = 0)
    {
        // TODO 'OK' または 'NG' を返す予定のメソッド
        return null;
    }
}

↑未実装メソッドをモックを使って、スタブ化したい

class ModelTest extends \PHPUnit_Framework_TestCase
{

    public function testLogin()
    {
        // モックを用意する
        $apiMock = \Phake::mock('...\Api');

        // スタブを定義する
        \Phake::when($apiMock)->auth(111)->thenReturn('OK');
        \Phake::when($apiMock)->auth(222)->thenReturn('NG');

        $model = new Model();

        $actual = $model->login($apiMock, 111);
        $this->assertTrue($actual);

        // スタブがちゃんと呼び出されたかを検証
        \Phake::verify($apiMock, \Phake::times(1))->auth(111);

        $actual = $model->login($apiMock, 222);
        $this->assertFalse($actual);
    }
}

ほっこり。