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 のデータをロードします。

PHPUnit のテストを Web から実行する VisualPHPUnit へ続く。