Laravel・PHP入門

PHPer初心者

【Laravel】【PHPUnit】コレクションや配列のテスト

今日はLaravelでよく出てくるCollectionデータのテストコードを書いていて
ハマったのでまとめます。


サンプルはこちら。
Post一覧取得APIのテストコード · aihara005/laravelprot@ba2e4b8 · GitHub
PHPUnitテスト by aihara005 · Pull Request #3 · aihara005/laravelprot · GitHub

PHPUnitの準備

まずはローカルでphpunitを使うための準備。
$ vi .env

APP_URL = 自分のURL
php artisan serveで立ち上げてる時は
http://127.0.0.1:8000

サンプルテストを作る

早速簡単なテストを作って通過するかチェックします。
前回の記事でちょうどGETリクエストでレスポンスを返すAPIを作成していたので
それを使って200レスポンスがかえるかテストします。

/tests/Feature/ExampleTest.php

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class ExampleTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testBasicTest()
    {
        $response = $this->get('/posts');

        $response->assertStatus(200);
    }
}

サンプルテストを実行する

$ ./vendor/bin/phpunit tests/Feature/ExampleTest.php //コマンドでphpunit叩く


f:id:fresh_engineer:20180712002447p:plain

成功しました!

コレクションのテストを作る

それでは前回作成したpostsのAPIについて、
postsコレクションがjsonで返却されるので
テストを作ってみます。

tests/Feature/PostsTest.php

<?php

namespace Tests\Feature;

use Tests\TestCase;
use Illuminate\Foundation\Testing\RefreshDatabase;

class PostsTest extends TestCase
{
    /**
     * A basic test example.
     *
     * @return void
     */
    public function testGetPosts()
    {
        $response = $this->get('/posts');

        $response->assertStatus(200)
                ->assertJsonStructure([ // Json形式を指定
                    'data' => [
                        // コレクション系は * でキーを指定すればok
                        '*' => [ 
                            'id',
                            'title',
                            'body',
                             // リレーションも1対多なのでネストした状態で * でキーを指定すればok
                            'comments' => [
                                '*' => [
                                    'id',
                                    'post_id',
                                    'body'
                                ]
                            ]
                        ]
                    ]
                ]);
    }
}

「*」 を使う形式でokでした・・・!

テストを実行する

$ ./vendor/bin/phpunit tests/Feature/PostsTest.php

f:id:fresh_engineer:20180712003836p:plain

コレクションなどでモデルが配列になって返ってくるタイプはこれで解決しそうです。
結構はまりました。。。

エラー

失敗パターンもちゃんと指摘してくれます。
例えば上記のpost_idをpost_aaaidなどに変換すると

f:id:fresh_engineer:20180712004115p:plain

そんなidないよって怒ってくれますね。素敵です。



以上