CakePHPでテストする

CakePHPってやつは、テストフレームワークを兼ね備えてるらしい(詳しくは知らないけど)。
そいで、いっちょテスト用のDBこさえて、テストデータ投入してテスト書いてみるかー!
といきりたってみたはいいけど、ぜーーんぜん上手いこといかへん。
CakePHP テスト で検索しても問題解決できるようなページに行けないし。
まぁ、ウンコPHPなんか使うやつらはテストなんてせーへんわな、きっと。

というわけで、Modelのテストをする際の注意事項を備忘録がてらつらつらと書いていくことにする。

  • cake/tests/lib/cake_reporter.php を修正
function CakeHtmlReporter($character_set = 'UTF-8'/*'ISO-8859-1'*/) {
  • app/config/database.php にテスト用の接続設定を追加する
class DATABASE_CONFIG {

    var $default = array(
        // うんちゃらかんちゃら
    );

    var $test = array(
        // うんちゃらかんちゃら
    );
}
  • app/tests/fixtures/user.test.php にテストデータをこさえる
class UserFixture extends CakeTestFixture
{
    var $name = "User";
    var $import = array('table' => 'Users', 'connection' => 'test');

    var $records = array(
        array(
            'id' => 1,
            'name' => 'test1',
            'created' => '2009-12-31 00:00:00',
            'modified' => '2009-12-31 00:00:00',
        ),
        array(
            'id' => 2,
            'name' => 'test2',
            'created' => '2009-12-31 00:00:00',
            'modified' => '2009-12-31 00:00:00',
        ),
        //
        // ずらずらー
        //
    );
}
  • app/tests/cases/models/user.test.php
App::import('Model','User'); 

class UserTestCase extends CakeTestCase
{
    var $fixtures = array('user');
    var $dropTables = false;    // 超重要!!

    function testTestfunc()
    {
        $this->User = ClassRegistry::init("User");

        // データ取得
        $r = $this->User->findById(1);
        $this->assertEqual($r["User"]["id"], 1);
    }
}

$dropTables = false をしとかないと、外部参照制約があった場合に drop table できなくてエラーになります。これがわからなくて1日ぐらい悩みました。デフォルトが true なのは頭おかしいとしか考えられない。

  • ブラウザでテストURLへ接続

http://example.co.jp/app/webroot/test.php

  • App Test Cases / models / User

を実行

グリーンバーが出れば成功!