[Laravel5.5でREST API + SPA] APIのユニットテストを書く

curlでちゃちゃっと動作確認しましたが、ユニットテストも書いて確認します。

ユニットテストファイル作成

$ php artisan make:test UserTest

これでtests/Feature/UserTest.phpが生成されますので、内容を以下のようにします。

<?php

namespace Tests\Feature;

use App\User;
use Tests\TestCase;
use Illuminate\Foundation\Testing\DatabaseMigrations;
use Illuminate\Foundation\Testing\WithFaker;
use Illuminate\Foundation\Testing\RefreshDatabase;

class UserTest extends TestCase
{
    use DatabaseMigrations;

    protected function setUp()
    {
        parent::setUp();
        (new \DatabaseSeeder())->run();
    }

    public function testIndex()
    {
        $response = $this->get('/api/users');
        $response->assertStatus(200);
        $this->assertCount(50, $response->json());
    }

    public function testShow()
    {
        $response = $this->get('/api/users/1');
        $response->assertStatus(200);
    }

    public function testStore()
    {
        $data = ['name' => 'テストユーザ', 'email' => 'fugagaga@hoge.com', 'password' => 'secret'];
        $response = $this->post('/api/users', $data);
        $response->assertStatus(200);

        $item = User::query()->find($response->json()['id']);
        $this->assertInstanceOf(User::class, $item);
    }

    public function testUpdatet()
    {
        $data = ['name' => 'ユーザ名前変更'];
        $response = $this->patch('/api/users/1', $data);
        $response->assertStatus(200);
        $response->assertJson($data);
        $item = User::query()->find(1);
        $this->assertSame('ユーザ名前変更', $item->name);
    }

    public function testDelete()
    {
        $response = $this->delete('/api/users/1');
        $response->assertStatus(200);
        $this->assertNull(User::query()->find(1));
    }
}

use DatabaseMigrations でテストの前後にmigrateとrollbackを行ってきれいな状態でテストしてくれるようになります。
また、(new \DatabaseSeeder())->run();でseedを実行してテストデータをインポートしています。

テスト用のDBはインメモリに設定

config/database.phpを以下のように。

    'connections' => [
        'sqlite_test' => [
            'driver' => 'sqlite',
            'database' => ':memory:',
            'prefix' => '',
        ],

phpunit.xmlを以下のように。
DB_CONNECTION要素を追加しています。

<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
・・・
    <php>
        <env name="APP_ENV" value="testing"/>
        <env name="BCRYPT_ROUNDS" value="4"/>
        <env name="CACHE_DRIVER" value="array"/>
        <env name="SESSION_DRIVER" value="array"/>
        <env name="QUEUE_DRIVER" value="sync"/>
        <env name="MAIL_DRIVER" value="array"/>
        <env name="DB_CONNECTION" value="sqlite_test"/>
    </php>
</phpunit>

ユニットテスト実行

$ ./vendor/bin/phpunit tests/Feature/UserTest.php
PHPUnit 7.2.4 by Sebastian Bergmann and contributors.

.....                                                               5 / 5 (100%)

Time: 427 ms, Memory: 18.00MB

OK (5 tests, 10 assertions)

以上です。

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

関連する投稿

検索語を上に入力し、 Enter キーを押して検索します。キャンセルするには ESC を押してください。

トップに戻る