12/31

PHP

PHPUnitでenvが読み込まれない謎の挙動

2週間くらい前に、通るだろうと思ったテストが通らず困っていました。調査に時間を使ってしまい、他の通ったテストと比較などした結果、

- 環境変数が読み込まれていない
- さらにそれは
 @runTestsInSeparateProcesses
 @preserveGlobalState disabled が原因である

ということがわかりました。

発端

テストで何かしらのクラスをモックする時、DIで注入されるクラスであれば

$mockRepo = Mockery::mock(Repo::class);
$this->app->instance(Repo::class, $mockRepo);

というふうにモックしていたのですが、staticメソッドなどを呼び出して使う関数はoverloadを使って

$mockRepo = Mockery::mock('overload:App\Path\To\Something\Repo');

としていました。
ところが、overloadしたクラスは他のテストメソッドなどから呼び出せなくなってしまうため

@runTestsInSeparateProcesses
@preserveGlobalState disabled

というアノテーションを付けて、他のテストと別プロセス扱いすることでoverloadのエラーを回避しました。(これがしばらく前からやっていた慣習)

ところがこの切り離しの影響でenvファイルが読み込まれていないことがわかりました。どうにかならんかなと思ったのですがうまくいかず、最終的にphpunit.xmlファイルにこのテストで使う環境変数をベタ書きすることで解決しました。

<php>
       <env name="HOGE" value="hoge"/>
       <env name="FUGA" value="fuga"/>
</php>

理想的にはコードの仕組みが把握し切れていない部分は一行もないようにしたいですね... (年末の教訓)

この記事が気に入ったらサポートをしてみませんか?