[CakePHP] コントローラのテストの書き方の基礎

モデルやコンポーネントに対して、コントローラのテストを書くのは大変だ。

モデルやコンポーネントはインプットとアウトプットがはっきりしている。故に直感的にテストケースを思い浮かべることができる。これに対して、コントローラは「何を以ってアクションが成功したと見なすか?」が多岐に渡るため、ぶっちゃけ、テストケースの立案が面倒臭いのである。

クックブックやブログなどを参考に、テスト初心者の自分が理解しておくべき点を整理しておきたい。

まずはクックブックに目を通す

テスト — CakePHP Cookbook 2.x ドキュメント
http://book.cakephp.org/2.0/ja/development/testing.html#id23

ヘルパーやモデル、コンポーネントも同様に、CakePHPは ControllerTestCase という コントローラーのテストに特化したクラスを提供します。 このクラスをコントローラーのテストケースの親クラスとすることで、 コントローラーのテストケースを testAction() というメソッドでより簡単にすることができます。 ControllerTestCase は擬似的にコンポーネントやモデルを動かすだけでなく、 redirect() のように潜在的にテストが難しいメソッドの テストも簡単にしてくれます。

testActionで出来ること

アクションの呼び出し

POSTリクエストのシミュレート

GETリクエストのシミュレート

アクションの結果を取得する

アクションの処理によって以下の情報が取得できる。

  • vars – ビューの値
  • view – レイアウト以外の描画されるビュー
  • contents – レイアウトを含む描画されるビュー
  • result – コントローラのアクションが返す値

アクションが成功したかチェックする

ビューに含まれる文字列を調べれば、期待したビューが表示されたかチェックできる

ロケーションを調べれば、期待したリダイレクトが行われたかチェックできる

変数を調べれば、コントローラが正しい変数をビューにセットしたかチェックできる

セッション変数をしらべれば、コントローラが正しい値をセッションにセットしたかチェックできる

参考サイト

[CakePHP] Controllerのテストを書くときに気をつけること – TODO: ブログの名前を考える
http://d.hatena.ne.jp/fullkawa/20120616/p1

CakePHPのControllerの画面遷移のユニットテストってどうやるの | もふもふ技術部
http://j-caw.co.jp/blog/?p=1015

CakePHP2でコントローラーのテストをする時の redirect を無視させない – ハウテレビジョン開発者ブログ
http://blog.howtelevision.co.jp/entry/2014/07/25/151754

cakephpでcontrollerのテストを極める | まとめーたー
http://matomater.com/17151/

sizuhiko – Technote – CakePHPのコントローラテストで注意すること
http://blog.open.tokyo.jp/2013/09/13/cakephp-2.html

CakePHPでAuth認証が必要なコントローラーをテストする – Qiita
http://qiita.com/ran/items/4a31b685f3c25c4f7e01