Testコントローラのテストは難解であるとは言え、テストを書かないというのも何なのでテストを書くわけですが。継承したクラスを作成し、内部的にそれを利用するように渡していました。2.3や2.4系では、モックオブジェクトを利用します。モックが必要?もしこの記事を読んでいる方で、testActionがブラウザからも、コンソールからも成功するよ、という場合は依存関係が少ないか、たまたまなのかもしれません。Webアプリケーションのコントローラは様々な依存関係があり、簡単にテストを通過させることができません。SessionComponentを使ったactionをテストする場合、問題が発生します。Sessionはブラウザからテストを実行している範囲では問題が起きないのですが、コンソールで実行するとエラーになるという事があります。コンソールにはセッションなんてないからね。実装上はセッションから値を取り出して何か処理をするという事がありえるわけです。}みたいなコードがあった場合にindexアクションをテストすると、ブラウザからは成功するのですが、コンソールからだと失敗する。経験したことありませんか?どうやってモックを使うのかで、調べてみたら意外と解説してある部分がない。いうときはCakePHPのコアテストコードを見るのが一番です。(lib/Cake/Test/Case/Controller/...でないところがミソ)。上記コードを参照した上で先ほどのテストコードを改修すると、以下のようになります。部分を除いた名前です。コントローラから依存関係にあるモジュールを同時にモックしたい場合に配列形式で記述します。今回はSessionコンポーネントをモックしたいので、第二引数に指定します。このgenerate()はコントローラの初期化や依存関係のモック処理もやってくれるとても強力な機能を持っています。PHPUnitのgetMockでモックするのではなく、必ずこのメソッドを使うようにしましょう。generate()の戻り値はコントローラのモックオブジェクトになっています。対して、read(‘hoge’)はいつでも'fuga'を返すという記述をすることが可能です。モック自体はPHPUnitのモックオブジェクトなので、詳しい記法はPHPUnitのマニュアルからモックオブジェクトの章を参照してください。最後にコントローラのテストは本当に難解です。コアのテストコードを見るだけでもだいぶ理解が深まります。一度自分のアプリでテストを書く前に、その親クラス(ModelとかControllerなど)やテストケースのテストコードを見ると、これまでにテストの書き方がわからなかったところも、腑に落ちることがあるはずです。