Laravel使ってみた (8) - Laravelでのモックテスト -
何やら前回で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、開発パッケージのインストールを見るべし