CIUnit でのモデルのテスト方法
CIUnit には、データベースフィクスチャの機能があります。これは、テストを実行する前にデータベースにあらかじめ用意されたデータを登録する機能です。この機能により、テスト実行時のデータをいつも同じにすることで、正しくテスト結果を判定することができます。
CIUnit については、CodeIgniter で PHPUnit によるアプリケーションテストを実行するための CIUnit をインストールする を参照してください。
データベースフィクスチャの生成
テスト用のデータベースから空のフィクスチャを生成するには、以下のコマンドを実行します。
$ cd tests $ php generate fixtures
この結果、tests/fixtures/ フォルダに「テーブル名_fixt.yml」という名前の yaml ファイルが作成されます。すでにそのファイルが存在する場合は、上書きされません。
fixtures/ フォルダには phone_carrier_fixt.yml が最初から含まれていますので、これを削除してからフィクスチャを生成してみましょう。
$ php generate fixtures generating... phone_carrier *** fixture fixtures/phone_carrier_fixt.yml written.
fixtures/phone_carrier_fixt.yml が作成されました。中には、以下のように、フィールド名のみが記載されています。
1: name: txt_address: txt_message_length: 2: name: txt_address: txt_message_length: 3: name: txt_address: txt_message_length:
このファイルにテストデータを記載すれば、このテーブルのフィクスチャは完成です。
もともと付属している phone_carrier_fixt.yml は、以下のようになっています。
1: name: 'Verizon' txt_address: '@vzpix.com' txt_message_length: 160 2: name: 'AT&T' txt_address: '@mms.att.net' txt_message_length: 160 3: name: 'Sprint' txt_address: '@pm.sprint.com' txt_message_length: 160 4: name: 'T-Mobile' txt_address: '@tmomail.net' txt_message_length: 160 5: name: 'Virgin' txt_address: '@vmpix.com' txt_message_length: 160
ちなみに、改行を含む文字列は以下のように記述します。
1: entry_id: 1 entry_name: テスト entry_body: | これはテストです。 2行目です。 entry_date: '2011-07-25 18:52:33'
既存データからのフィクスチャの生成
すでにテーブルにテストデータが含まれている場合は、generate.php を使います。
$ php generate.php fixtures
とすると、fixtures/ フォルダに現在のテーブルのデータのフィクスチャを作成します。デフォルトでは、データは 5件のみ取得されるようになっています。このコマンドは、yaml ファイルがすでに存在していても上書きします。
以下のように n オプションで取得する件数を指定できます。
$ php generate.php fixtures -n 10
データベースフィクスチャの使い方
$tables プロパティ
データベースフィクスチャを使うには、モデルのテストに $tables プロパティを定義し、テーブル名とフィクスチャ名を定義した配列を代入します。
<?php /** * @group Model */ class Foo_model_test extends CIUnit_TestCase { protected $tables = array( 'table1' => 'table1', 'table2' => 'table2', );
上記の例では、table1 テーブルに table1_fixt.yml が table2 テーブルに table2_fixt.yml のデータが使用されます。配列のキーが「テーブル名」、値が「yaml ファイル名」(_fixt.yml を削除したもの)です。
$tables プロパティを設定すると、テストの親クラスである CIUnit_TestCase クラスの setUp() メソッドで、テーブルが truncate され、フィクスチャのデータがデータベースにロードされます。
setUp() メソッドは、テストメソッドが呼ばれる度に実行されます。
そして、CIUnit_TestCase クラスの tearDown() メソッドでデータがロードされたテーブルが truncate されます。
dbfixt() メソッド
また、以下のように dbfixt() メソッドを使って、フィクスチャをロードすることができます。
$this->dbfixt(array( 'table1' => 'table1', 'table2' => 'table2', ) );
$this->dbfixt('table1', 'table2');
上記の例は、いずれも table1 テーブルを truncate し、table1_fixt.yml のデータをロードし、table2 テーブルを truncate し、table2_fixt.yml のデータをロードします。