FuelPHP のオンラインマニュアルはAPIリファレンス的な構成となっているため、用意されている様々な機能を応用しにくく感じていました。
この書籍は「実践編」と銘打っているだけあって、実際のアプリケーション構築の際に必要とされるであろう事項に対して、Fuelを使っていかに実装するかが書かれており非常に実践的です。実際の開発現場できっと役立つと思います。
そんな中で特に有用だと感じたのは、アプリケーションレイヤー毎のテスト方法について詳しく書かれている点です。例えば「4.7 モデルのテスト」では、データベース上への効率的なテストデータ作成方法や、「第6章 コントローラのユニットテスト」では通常はテストし難いコントローラのテストを AspectMock を用いて行う方法が書かれています。今回はそれぞれ簡単に紹介してみようと思います。
モデルのユニットテスト
モデルをテストするためには事前にデータベース上にテストデータを格納しておく必要があります。ボクは今まで Fuel の Orm\Model クラスを利用してテストデータを作成していました。例)Orm\Model を使ったテストデータの作成例
$u = Model_User::forge(array(
'username' => '担当1',
'password' => 'KWd27qfZtlw9qbEVMe5v2zRnZUuC0Eqa330cdN+9lro=',
'email' => 'hoge@hoge.jp',
'last_login' => '2013-08-30 00:00:00',
'created_user' => 1,
));
$u->save();
$g = Model_Group::forge(array(
'name' => 'グループ1',
'status' => 0,
'created_user' => 1,
));
$g->save();
書籍では YAML ファイルでテストデータを記述して、Fuel の Format クラスを使ってデータ登録する方法が紹介されています。この方が保守性も汎用性も高くよいですね。さっそく現場で活用できそうです。
例)YAML ファイルを使ったテストデータの作成(書籍からの引用)
id: 1
name: 小野小町
email: komachi@example.jp
comment: |
花の色は移りにけりないたづらに
我が身世にふるながめせし間に
ip_address: 192.168.1.1
user_agent: Mozilla/5.0 (X11; Ubuntu; Linux i686; rv:11.0) Gecko/20100101 Firefox/11.0
created_at: 1333524234
updated_at: 1333524234
-
id: 2
name: 文屋康秀
email: yasuhide@example.jp
comment: |
吹くからに秋の草木のしをるれば
むべ山風を嵐といふらむ
ip_address: 10.10.10.10
user_agent: Mozilla/5.0 (Macintosh; Intel Mac OS X 10.7; rv:9.0.1) Gecko/20100101 Firefox/9.0.1
created_at: 1333534305
updated_at: 1333534305
上記 YAML を下記コードで配列にして DB へインサート出来ちゃいます。
$data = file_get_contents($fixt_file);
$data = Format::forge($data, static::$file_type)->to_array();
foreach ($data as $row) {
DB::insert($table)->set($row)->execute();
}
また、ボクは Format クラスの存在を知らなかったのですが便利なクラスですね。YAML 以外にも様々なファイルフォーマットに変換可能で下記フォーマットに対応していて今後活躍してくれそうです。
- CVS
- XML
- json
- シリアライズ文字列
- xml:ns
コントローラのユニットテスト
コントローラのユニットテストとして「AspectMock」というモックアップツールを使った方法が紹介されています。 コントローラのユニットテストは難しいのでボクはユニットテストは諦めて、テストサーバを立てて PHPUnit_Extensions_Selenium2TestCase によるUIテストによる自動化を行ってきましたが、AspectMock を使えば簡単にユニットテストができます。例えば static メソッドである Validation::run() で true を返させたい場合はコントローラを呼ぶ前に下記コードを呼んでおくだけです。
use AspectMock\Test as test;
・・・略・・・
test::double('Fuel\Core\Validation', ['run' => true]);
// HMVCリクエストを実行
$response = Request::forge('form/confirm')->execute()->response();
便利ですねぇ。もう明日からでも使いたい気分です。 他にも
- 2.1.5 独自検証ルールの作成
- 2.3 ファンクショナルテストの追加
- 第7章 コードカバレッジ解析
など、現場で即活用したい内容が目白押しです。すでにFuelを利用している方にはとても役立つ書籍だと思うのでオススメです。