FuelPHPでPHPUnitのユニットテストをやる時、test環境を使ってる件
FuelPHPは、development、test、staging、productionという4つの環境ごとにconfigファイルを分けることができます。実際にどれを使うか?は、public直下の.htaccessの初っぱなあたりに書かれている
SetEnv FUEL_ENV production
を動かしたい環境にあった内容に書き換えればOKです。あるいはbootstrap.phpの書き換えでも可能。
また、oilを使ってコマンドを実行する場合は、
FUEL_ENV=test oil refine migrate
などのように、FUEL_ENVで指定して好きな環境で実行させることもできます。
そしてPHPUnit。
なんだかんだtests以下にテストしたいことを書いて、これまたoilから次のように実行できます。
oil test --group=App
通常は特に問題ないんだと思うのですが、ちょっと困ったことが起きました。
こちらを参考に進めていたところ、「管理ページの作成」の「ファンクショナルテストの追加」で、テストが通らない。。
現象としてはこんなことになってました。
・自分としてはdevelopmentの環境で実行してるつもり
・ファンクショナルテストで入力画面などを通して書き込まれるDBはdevelopment
・PHPUnitの中でDB::insertなどをするDBはtest
明示的に指定しないとダメなのか?と思い、PHPUnitをoilで実行する際に
FUEL_ENV=development oil test --group=Functional
のように指定しましたが、状況は変わりません。
PHPUnitがなぜFUEL_ENVを無視するのか?と思って調べてみると、PHPUnitは
の中の
<server name="FUEL_ENV" value="test"/>
を参照しているようです。
そこで、このファイル自体を/fuel/app以下へコピーして、
<server name="FUEL_ENV" value="development"/>
のように書き換えると、PHPUnitもdevelopment環境を参照するようになりました。
ファンクショナルテストを一緒にやっていて、そっちは.htaccessの設定に従ってDBに値を書き込んでいました。.htaccessはコメントアウトしたままだったので、デフォルトのdevelopmentが選択され、DBもそちらへ。
今回は同時にPHPUnitで直接データを書き込んでおり、同じDBに書き込まれていることを前提としたチェック方法になっていたことが原因かな?と思います。
もっとも、僕が本書中にあるこれらの記述を見落としていた可能性があるのと、そもそも「テストするのがtest環境」だと思うのであんまりやらないことかもしれませんが・・・。