カテゴリー
コンピューター

Laravel 6 ユニットテストをする際 Docker Compose の環境変数を上書きできずにはまったが phpunit.xml ドキュメントを読んで解決した

まとめ

<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_ENVtesting で問題なく、 DB_CONNECTIONDB_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 については以前次のページに調べたことをまとめています。

以上です。

コメントを残す