Laravel使ってみた (8) - Laravelでのモックテスト -

2013-07-10T00:00:00+00:00 Laravel PHP

何やら前回でEventがあーだらこーだらですっ飛ばすっていうのを書いたんですが、あれEventがどうだとかいう事じゃなくて、単純にMockオブジェクトとしてのテスト手法なセクションだった模様で

まぁ例題的にはLogクラスをモックオブジェクトにしちゃうとかっていう所が単純そうなので、「アクションからLog::infoされた内容を検査する」的な感じで、コントローラーは単純に

<?php

public function show($id) {
    Log::info("id = $id");
}

っていう感じで引数な$idをinfoログとして出力させておくだけ。でこのコントローラーな所にアクセスした際にこの引数を検査する

<?php

class HomeControllerTest extends TestCase {
    public function test_show() {
        Log::shouldReceive("info")->once()->with(
            Mockery::on(function(&$data) {
                // fail: 98じゃなくて99
                $this->assertThat($data, $this->equalTo("id = 98"));

                return true;
            })
        );

        $crawler = $this->client->request("GET", "/show/99");
        $response = $this->client->getResponse();
        $this->assertResponseOk();
    }
}

ちなみに

Log::shouldReceive("info")->once()->with("id = 99");

的な感じでも使える模様。でLaravelのテスト自体はPHPUnitだけど、PHPUnitが本来持ってるモック的なAPIではなく、 https://github.com/padraic/mockery っていうのを使ってる模様。んまぁ右のMockeryはリンクになってるのでそれを参照。ちょっと使うときにトラブりましたけど(後述している余談を参照)。

っていう感じで前回の補足的な感じで。Mockeryに関しては http://tech.aainc.co.jp/archives/3918 が参考になるかも。一応書いておく

余談: MockeryがClass not foundになる

何やらLaravelもcomposerも古かったのか最初から入ってなかったのかわかりませんが、Mockery及びWhoopsとかっていうのがクラス解決出来なかったので、composer.jsonに

{
  "require-dev": {
    "filp/whoops": "1.*",
    "mockery/mockery": "*"

な記述を追加する。あとはcomposer installとかupdateしろって警告出るならそれをやる

追記

パッケージインストールな件なところに関しては Laravel4、開発パッケージのインストールを見るべし

Laravel使ってみた (9) - Error&Logging - Laravel使ってみた (7) - Controller Testing -