3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

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

Posted at

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

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

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

3
3
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
3
3

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?