まとめ
<php>
要素 (PHP INI 項目や定数、グローバル変数の設定) では、既存の環境変数は上書きされない。上書きしたいならば、 force
属性を使う。
ドキュメントはこちら。といいますか、 phpunit.xml で検索して最初のページでした。
ハマっていた内容
Docker Compose で立ち上げたコンテナ内に Laravel 6 を構築しています。 コンテナ内で PHPUnit を実行したとき、接続データベースがテスト用のインメモリ SQLite ではなく、開発や運用時に使う通常のデータベースとなっていました。
Laravel からデータベースへの接続方法は、 データベース URL を使っています ので、これを上書きすればよいわけです。 しかし、なかなかうまくいきません。
調べて 【Laravel】.env.testingの使用方法と注意点 – Qiita の通りに .env.testing
を作ってみたり、 phpunit.xml
の <php>
の <server>
を <env>
に変えてみたりしました。
でもやっぱりダメでした。
改めて調査をしようと、ユニットテストコードに次を埋め込んで 環境変数を取得 してみました。
public function setUp(): void
{
//dd(env('APP_ENV'));
//dd(env('DATABASE_URL'));
//dd(env('DB_CONNECTION'));
//dd(env('DB_DATABASE'));
parent::setUp();
$this->seed();
}
すると、 APP_ENV
は testing
で問題なく、 DB_CONNECTION
と DB_DATABASE
も狙い通りでしたが、 DATABASE_URL
が Docker Compose 環境変数の値のままで、ダメです。 DATABASE_URL
をなんとかしたいのですよね。。。
そこで、PHPUnit 公式ドキュメントの 3. XML 設定ファイル — PHPUnit latest Manual を見てみますと、、、、、こんな記述があるではありませんか!
デフォルトでは、既存の環境変数は上書きしません。 設定済みの環境変数を上書きしたい場合ば force 属性を使いましょう。
<php> <env name="foo" value="bar" force="true"/>
謎はすべて解けました。
<php>
<env name="DATABASE_URL" value="sqlite:///:memory:?foreign_key_constraints=true"/>
↓
<php>
<env name="DATABASE_URL" value="sqlite:///:memory:?foreign_key_constraints=true" force="true"/>
と変更し、 PHPUnit を実行してみますと、ようやく DATABASE_URL
は上記の値であるインメモリの SQLite を見るようになってくれました!!!
おわりに
別のことをするために、今まで散々やってきたユニットテストの箇所でつまづいた、今回はそんな状況でした。
脇道でつまづくと、本道でつまづくよりも、より焦ってしまいます。こんなところで足止めされている場合じゃないんだ、と。
なんとか今回、落ち着いて対処できた方と思います。よかったです。
ちなみに、データベース URL については以前次のページに調べたことをまとめています。
以上です。