【Laravel】Laravel組み込みのテスト用便利trait集

 Laravelの中にはPHPUnitを継承したテストケース用クラスである\Illuminate\Foundation\Testing\TestCaseが用意されています。テスト: テストの準備 6.x Laravel
このクラスを継承して作ったテストケースクラス内ではid, passwordを無視したログイン、HTTPリクエストとレスポンスの再現など便利な機能が使えます。この便利機能は大体 $this-> から予測補完を眺めると存在に気付けるのですが、これ以外にも任意でリッチな機能のON/OFFを決めるtraitが用意されています。
 traitの機能の扱い方は基本的にuseの有無のみです。useすると大体次の様な感じでuseされていたら実行、という処理が走り出します。

// ExampleTest
<?php

namespace Tests\Unit;

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

class ExampleTest extends TestCase
{
    use DatabaseTransactions; // こんな感じにuseするだけで動く
}
// \Illuminate\Foundation\Testing\TestCase
    /**
     * Boot the testing helper traits.
     *
     * @return array
     */
    protected function setUpTraits()
    {
// useしているtraitを集める
        $uses = array_flip(class_uses_recursive(static::class));

// useしているかチェックして、useされていれていたらメソッドを実行
        if (isset($uses[RefreshDatabase::class])) {
            $this->refreshDatabase();
        }

        if (isset($uses[DatabaseMigrations::class])) {
            $this->runDatabaseMigrations();
        }

        if (isset($uses[DatabaseTransactions::class])) {
            $this->beginDatabaseTransaction();
        }

        if (isset($uses[WithoutMiddleware::class])) {
            $this->disableMiddlewareForAllTests();
        }

        if (isset($uses[WithoutEvents::class])) {
            $this->disableEventsForAllTests();
        }

        if (isset($uses[WithFaker::class])) {
            $this->setUpFaker();
        }

        return $uses;
    }

 この記事では上記コードにある6つのtraitの機能を紹介します。

RefreshDatabase

和訳公式ページの各テスト後のデータベースリセットに説明があります。
データベースのテスト 6.x Laravel
これはテスト開始時にartisan migrate:freshし、テスト中にトランザクションを張り続け、テスト終了時にロールバックする機能です。これを使うと常にまっさらなデータベースでテストができます。これはデータベースの種別が異なっても同じ様な動作をするらしいです(試したことなし)。

DatabaseMigrations

テスト開始時にmigrate:freshしてテスト終了時にmigrate:rollbackするのみです。

DatabaseTransactions

テスト開始時にトランザクションを開始してテスト終了時にロールバックするのみです。私的に一番よく使います。テストでバグ(テスト自体でもテスト対象でも)が起きても整合性が取れていると確信できるテストデータを壊さずに済みます。

WithoutMiddleware

その名の通りテスト中にミドルウェア(app/Http/Middlewareなどで定義しているアレ)の動作を止めます。セキュリティの都合で外せないが、テストでは外したい、といったミドルウェア達をまとめて無視する時などに使います。実装がちょっと特殊で処理実体はtrait先でなく\Illuminate\Foundation\Testing\Concerns\MakesHttpRequests::withoutMiddlewareにあります。

WithoutEvents

その名の通りテスト中にイベントの動作を止めます。これも実装がちょっと特殊で処理実体はtrait先でなく\Illuminate\Foundation\Testing\Concerns\MocksApplicationServices::withoutEventsにあります。

WithFaker

その名の通りfakerのついたテストを書けます。factoryでモデルのダミーを作るほどではないけれど……といったちょっとしたダミーデータを作る時に使うのが便利です。

    public function testBasicTest()
    {
        $this->faker->name; // Fakerによるそれらしいランダムなnameの値
    }
>株式会社シーポイントラボ

株式会社シーポイントラボ

TEL:053-543-9889
営業時間:9:00~18:00(月〜金)
住所:〒432-8003
   静岡県浜松市中央区和地山3-1-7
   浜松イノベーションキューブ 315
※ご来社の際はインターホンで「316」をお呼びください

CTR IMG