読者です 読者をやめる 読者になる 読者になる

FuelPHP で DBUnit 使ってみる

最近、自動テストの重要性に気が付き PHPUnit を導入しましたが、DB のデータを使ったテストが Rails のように上手く出来ないことに軽く絶望していました。
しかし、DBUnit なるイケてる拡張があるみたいなので試してみました。

ざっくり DBUnit とは

テストの度にテスト用DBに初期値入れたり、DBを初期化するのが面倒...。

でも DBUnit さえいれば!!!!テストの度に自動でDBを初期化してくれて、初期値入れるのも楽!!!!!!素敵!!!!!!!!!!

やったこと

  • DBUnit 拡張の導入
  • とりあえず動かす

DBUnit 拡張の導入

下記のサイトを丸パクりしましたので、この記事の内容も下記リンクの流れに沿っています。 DBUnit拡張を使ったFuelPHPのテストを考える

とりあえず動かす

まずは下記コマンドで、DB構築。
* FUEL_ENV=test oil r migrate
* FUEL_ENV=test oil r migrate --packages=auth

そして、APPPATH/config/test/db.php でテスト用のデータベースへアクセスする設定をする。

テスト環境のDB設定が終わったので、とりあえず初期データも投入せず DbTestCase を継承した状態でテストが動くか確認しました。
その結果、下記のエラーが出ました。

Error - Argument 1 passed to PHPUnit_Extensions_Database_AbstractTester::setDataSet() must be an instance of PHPUnit_Extensions_Database_DataSet_IDataSet, null given, called in /Users/test_user/fuel_test/fuel/vendor/phpunit/dbunit/src/Extensions/Database/TestCaseTrait.php on line 178 in DOCROOT/fuel/vendor/phpunit/dbunit/src/Extensions/Database/AbstractTester.php on line 88

なぜコピペしたのに動かないのでしょうか?

とりあえずエラー文的には setDataSet() は絶対定義しろ的なことが書いてあると思うので、からの setDataSet() を定義してみましたが、結果は変わらず。
よく見直してみると、 testcase.phpnamespace Fuel\Core; を入れるのを忘れていたのでちゃんと入れてテストを実行したところ、今度は次のようなエラーが出ました。

Fatal Error - Class 'DbTestCase' not found in APPPATH/tests/controller/test.php on line 7

困りました、not found と言われてしまってはどうしようも無いので、とりあえずさっきの状態に戻します。

ふと、 setDataSet() が問題なのでは無く、getDataSet() が空なのが問題なのでは無いかと思ったので、先程参考にしたサイトに書いてあったものをテーブル名だけ変えてコピペしてみたところ、なんと正常に動作しました。
大して難しくないところで余計な時間が取られてしまいました...。

しかし、namespace Fuel\Core; を入れてエラーが出てしまう事象については PHP への理解が足りないこともあって謎なので、「coreクラスの拡張」か何かでググってみようと思います。

まとめ

とりあえず動いたので、後は適当にググりながら Rails のようにイケイケなテストが書けると思います。
何か進展があればまた記事書きます。