【Laravel】テスト用DBの環境設定でつまずいた


PHPUnitを使ったテストを実施しようとして、エラーは出るは、SQLiteのテーブルのレコードは消えるは、
つまずいてしまったので忘備録として書き留めておきます。

テスト用DBの定義追加

config/database.phpconnections にテスト用DBの定義を追加します。

database.php
'connections' => [
    // ここから
    'testing' => [
        'driver' => 'sqlite',      // SQLite指定
        'database' => ':memory:',  // SQLiteのインメモリ機能を使用
        'prefix' => '',            // 接頭辞
    ],
    // ここまでを追加

    //省略
]

テストで使用するDBの指定

phpunit.xmlDB_CONNECTION の設定を追加します。

phpunit.xml
<php>
    <!-- 省略 -->
    <server name="DB_CONNECTION" value="testing"/>
    <!-- 省略 -->
<php>

テストケースの作成

環境設定はできたので、下記のコマンドでテストコードを作成します。
tests/Feature/にテストコードが作成されます。

php artisan make:test TempTest

テストケースを作成します。

TempTest.php
<?php

namespace Tests\Feature;

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

class TempTest extends TestCase
{
    /* テストケース毎にデータベースをリフレッシュしてマイグレーションを再実行する */
    use RefreshDatabase;

    /**
     * 各テストメソッドの実行前に呼ばれる
     */
    public function setUp(): void
    {
        parent::setUp();

        // テストケース実行前にフォルダデータを作成する
        $this->seed('BookingSeeder');
    }

    /**
     * "@test"はテストメソッドとして認識されるために必要
     * @test
     */
    public function reservation_date_should_be_date()
    {
        /* 第一引数:アクセスする URL */
        /* 第二引数:入力値 */
        $response = $this->post('/', [
            'reservation_date' => 123,
        ]);

        /* エラーになるべきデータを指定 */
        $response->assertSessionHasErrors([
            'reservation_date' => '予約日 は日付を入力してください',
        ]);
    }
}

いざ、テスト実施

下記コマンドでテストコードのテストケースを全て実施します。

./vendor/bin/phpunit ./tests/Feature/TempTest.php --testdox
PHPUnit 8.5.8 by Sebastian Bergmann and contributors.

Temp (Tests\Feature\Temp)
 ✘ reservation date should be date
   ┐
   ├ Session is missing expected key [errors].
   ├ Failed asserting that false is true.     
   │

   //省略

あれ、エラーが。。。テスト用DBではないSQLiteのテーブルの中身が綺麗まっさらになってるし。。。
どういうことだ。。。

色々調べたところ、最初に修正したconfig/database.phpがうまく反映されていなかったぽい。
内部キャッシュをクリアして再度configファイルを読んでもらいました。

php artisan config:clear

もう一度テスト実施コマンドを実行したところ、正常に動作しました。

部分的にコンパイルしてリンカの生成がうまくいっておらずエラーになる、
そんな感じのエラーだなと思いました。