気がつかなくてしばらくハマったのでメモ(^^;
コントローラのテストでモデルをモックに差し替えてテストしたくなったので、すでにあったテストコードにモック生成コードを追加してはまりました。
// Mock生成
$this->UploadFile = $this->getMockForModel('Files.UploadFile', ['getRealFilePath']);
// ここでMockにあれこれする
// 元々あったコンポーネント差し替えのコード
$this->generate(
'Cabinets.CabinetFiles',
[
'components' => [
'Download'
]
]
);
// このあとコントローラテスト実行
こんな感じで書いてたらコントローラでモデルがさっぱり差し替わらない。
Xdebug使って処理追っかけてたら getMcokForModel()
でモック生成時にClassRegistry::$_objectsにちゃんとモックがはいってるのに、コントローラの実行時にはClassRegistry::$_objectsは初期化されたようにまっさら…
でテストコード中にもClassRegistry::init('Files.UploadFile')でモデルを取得してクラス名確認してて分かったんですが、どうやら$this->generate()
するとClassRegistry::$_objects
はきれいさっぱりリセットされるみたいですね。
考えてみると$this->generate()
でもモックへの差し替えとかやってるんで、testAction前に一旦まっさらにしてからモック生成と差し替えって流れなんでしょうね…
まとめ
コントローラテストでモデルをモックに差し替えたいときは $this->generate()
してから$this->getMockForModel()
して差し替えましょう。