App::usesでモデルをロードしちゃうと、ユニットテストで困る

CakePHPのテストをする際の備忘録。

こんな感じの関連のあるDBテーブルが存在するとして、

class User  extends AppModel{
    public $belongsTo = array(
        'Profile' => array (
            'className'  => 'Profile'
        )
    );
}

別モデル内でApp::usesを利用してモデルを読み込み

App::uses('User', 'Model');
$UserModel = new AdminSyncReserve();

こんな感じで利用してみると

$options = array(
    'conditions' =>array (
        'Profile.age' => '20'
    )
);
$result = $UserModel->find( 'all',$options);

通常の利用では問題なく関連する情報をとってくるけど、テストから利用すると以下の様にカラムが存在しないよってエラーが表示される。
SQLSTATE[42S22]: Column not found: 1054 Unknown column ‘Profile.age’ in ‘where clause’

サイト上では問題ないのになぁと思いつつ、モデルの呼び出し方をApp::usesからClassRegistryに変更したらテストでも問題なく動作するようになった。
2つの違いを調べてみたところ、
・CassRegistryの場合はリフレクションクラスを利用して既存の設定をごにょごにょしてくれる
・App::usesは初期設定の状態でインスタンスを生成する
ということでApp::usesした方は設定が引き継がれていなかったみたい。

ユニットテストのことも考慮して、モデルはすべてClassRegistryでロードするようにしよう。