Tag Archives: SimpleTest

fixtureがテスト用データベースに反映されない?

このエントリーをはてなブックマークに追加
はてなブックマーク - fixtureがテスト用データベースに反映されない?
Share on Facebook

CakePHPでフィクスチャを作成したけど、テスト実行時にフィクスチャではなくDBのデータをロードしてしまう。ちゃんとテストケース内で $fixtures に設定しているはずなのに。

そんな症状に長らく悩んでいましたが、結論から言うと、$fixturesで指定しているフィクスチャ名を書き間違えていたせいでした。ファイル名を間違えている時、テストケースはエラーを吐かず、DBを読みに行ってしまうようです。

ずいぶん悩みましたが、初歩的なミスでした。

確かめた記事

Mark Story「1.2のNightlyリビジョンで直ってるよ」

→解決してない

「フィクスチャがDBに入らないんだけど」

「テスト動かせば自動で入るよ」

「知ってるよ。そのはずなのに入らないから聞いてるんだ」

返事無し

CakePHP 単体テストで使うメソッドのコールバックの実行順

このエントリーをはてなブックマークに追加
はてなブックマーク - CakePHP 単体テストで使うメソッドのコールバックの実行順
Share on Facebook

公式マニュアルだけではSimpleTestのコールバックの実行される順序がわからなかったので、調べた結果をメモしておきます。

下のようなコードを実行してみました。実際のテストメソッドは「testHige()」です。

<?php
App::import('Controller', 'Usos');

class TestUsosController extends UsosController {
    var $autoRender = false;

    function redirect($url, $status = null, $exit = true) {
        $this->redirectUrl = $url;
    }
}

class UsosControllerTestCase extends CakeTestCase {
    var $fixtures = array('app.uso');

    function startTest() {
        echo("startTest\n");
        $this->Usos =& new TestUsosController();
        $this->Usos->constructClasses();
    }

    function endTest() {
        echo("endTest\n");
        unset($this->Usos);
        ClassRegistry::flush();
    }
    
    function start() {
        echo("start\n");
    }
    
    function end() {
        echo("end\n");
    }
    
    function startCase() {
        echo("startCase\n");
    }
    
    function endCase() {
        echo("endCase\n");
    }
    
    function before($method) {
        echo($method . " before\n");
    }
    
    function after($method) {
        echo($method . " after\n");
    }

    // 実際のテストメソッド
    function testHige() {
        echo("testHige\n");
    }
}
?>

実行結果は以下の通りです。

start before
start
start after
startCase before
startCase
startCase after
testHige before
testHige
testHige after
endCase before
endCase
endCase after
end before
end
end after

大まかに書くと「start() → startCase() → testHige() → endCase() → end()」の順に実施され、それぞれのメソッドの前後にbefore($method) と after($method) が呼び出されるようです。

参考