testActionを使う時はautoRenderがfalseだとダメ
CakePHPでBake使ってControllerのテストを作るとき、一緒にテストしたいControllerクラスのMockみたいのができるのだけど、
そのクラスはredirectされないようにoverrideされていたり、renderされないように
public $autoRender = false;
となってたりする。
で、今日テスト書いてて
$actual = $this->testAction('/test_hogehoge/index', array( 'method' => 'get', 'return' => 'view', ));
みたいな感じでtestActionの結果を受け取ってviewの中身を見ようと思ったら空で、
「あれれれれー」ってずっとハマってしまった。
理由はDispatcherの113行目の条件分岐で、
if ($render && $controller->autoRender) { $response = $controller->render(); } elseif ($response->body() === null) { $response->body($result); }
の部分。
autoRenderがfalseになっているとrenderが呼ばれず、renderが呼ばれないからviewも作られないと。
当たり前と言えば当たり前なのだけど、頭のどこかで「Mockだからrender使わずにview作っているんだろう」と思い込んでたのがハマったポイントでした。
testAction使うときはテスト用のcontoller使わずに'/hogehoge/index'でやれば良いと。