PHPUnitを使ったテストを実施しようとして、エラーは出るは、SQLiteのテーブルのレコードは消えるは、
つまずいてしまったので忘備録として書き留めておきます。
##テスト用DBの定義追加
config/database.php
の connections
にテスト用DBの定義を追加します。
'connections' => [
// ここから
'testing' => [
'driver' => 'sqlite', // SQLite指定
'database' => ':memory:', // SQLiteのインメモリ機能を使用
'prefix' => '', // 接頭辞
],
// ここまでを追加
//省略
]
##テストで使用するDBの指定
phpunit.xml
に DB_CONNECTION
の設定を追加します。
<php>
<!-- 省略 -->
<server name="DB_CONNECTION" value="testing"/>
<!-- 省略 -->
<php>
##テストケースの作成
環境設定はできたので、下記のコマンドでテストコードを作成します。
tests/Feature/
にテストコードが作成されます。
php artisan make:test TempTest
テストケースを作成します。
<?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
もう一度テスト実施コマンドを実行したところ、正常に動作しました。
部分的にコンパイルしてリンカの生成がうまくいっておらずエラーになる、
そんな感じのエラーだなと思いました。