【Laravel】PHPUnit実行時に開発用DBを初期化してしまわないために
結論
テスト実行前に必ず php artisan config:clear を実行してcacheファイルを削除しておく。
そうしないとphpunit.xmlの設定が適用されずに、cacheに残っている開発用のenv設定が適用され、開発用のDBで RefreshDatabase が起こってしまう。
Version
・PHP 8.0
・Laravel 9.2
失敗した話
Laravel開発において、設定などを変更したり、migrationを実行した際に php artisan optimize も一緒に実行していた。
データ最適化コマンドだからやり得だろうと思っていたが、これが原因でPHPUnit実行時に開発用DBが初期化さてしまっていた。
php artisan optimize
php artisan optimize は以下のコマンドを同時に実行するコマンドである。
php artisan config:cache
php artisan route:cache
このうち php artisan config:cache はconfigディレクトリ配下をキャッシュするコマンドだが、そのキャッシュファイルは.envに書いてある環境変数をベースに作成される。
そして、このキャッシュファイルはPHPUnit設定用ファイルであるphpunit.xmlよりも適用優先度が高くなってしまうため、キャッシュファイルが存在した状態でテストを実行すると、テスト用のDBではなく開発用のDBでテストを実行してしまう。
そのため、テスト実行時に開発用のDBで RefreshDatabase が実行されてしまっていた。
対策
テスト実行前に以下コマンドを実行して、キャッシュされているconfigファイルを削除する。
php artisan config:clear
もしくは、そもそも開発時にcacheファイルを作成しない。 公式にもそう書いてある。
参考
- Laravel test実行時にはconfig:cacheは要注意 - Qiita
- 【Laravel】キャッシュクリア系コマンドには、テストコード実行前に流さない方がよいものがある | かきエンジン
- 【Laravel】開発環境では「php artisan config:cache」をするべきではない - Qiita