結論
PHPUnitテスト実行時に「no such table」エラーが出たら、
テスト接続先DBがインメモリになっていないか設定を確認しよう🍄
事例
LaravelプロジェクトでPHPUnitテストを実行したら、
以下のエラーが出た。
root@efed49901495:/var/www# vendor/bin/phpunit tests/Unit/HogeServiceTest.php
PHPUnit 8.5.0 by Sebastian Bergmann and contributors.
E 1 / 1 (100%)
Time: 868 ms, Memory: 20.00 MB
There was 1 error:
1) Tests\Unit\ReportServiceTest::countHoge_正常
Illuminate\Database\QueryException: SQLSTATE[HY000]: General error: 1 no such table: hoges (SQL: select count(*) as aggregate from "hoges")
原因
テスト接続先DBの設定が、SQLiteのインメモリ機能を使用するようになっていた。
phpunit.xml
<php>
(省略)
<server name="DB_CONNECTION" value="sqlite"/>
<server name="DB_DATABASE" value=":memory:"/>
</php>
Q. テスト接続先DBの設定は.env
管理じゃないの?
A. じゃない……です🍄
Laravelでは環境変数を.env
で設定します。
ですが、テスト時の環境変数はphpunit.xml
内で指定された値が利用されます。
解決方法
テスト接続先DBの設定を、指定したいDBに合わせて修正。
phpunit.xml
<php>
(省略)
<server name="DB_CONNECTION" value="mysql"/>
<server name="DB_DATABASE" value="testdb"/>
</php>