モデルやコンポーネントに対して、コントローラのテストを書くのは大変だ。
モデルやコンポーネントはインプットとアウトプットがはっきりしている。故に直感的にテストケースを思い浮かべることができる。これに対して、コントローラは「何を以ってアクションが成功したと見なすか?」が多岐に渡るため、ぶっちゃけ、テストケースの立案が面倒臭いのである。
クックブックやブログなどを参考に、テスト初心者の自分が理解しておくべき点を整理しておきたい。
まずはクックブックに目を通す
テスト — CakePHP Cookbook 2.x ドキュメント
http://book.cakephp.org/2.0/ja/development/testing.html#id23
ヘルパーやモデル、コンポーネントも同様に、CakePHPは ControllerTestCase という コントローラーのテストに特化したクラスを提供します。 このクラスをコントローラーのテストケースの親クラスとすることで、 コントローラーのテストケースを testAction() というメソッドでより簡単にすることができます。 ControllerTestCase は擬似的にコンポーネントやモデルを動かすだけでなく、 redirect() のように潜在的にテストが難しいメソッドの テストも簡単にしてくれます。
testActionで出来ること
アクションの呼び出し
1 |
$result = $this->testAction('/articles/index'); |
POSTリクエストのシミュレート
1 2 3 4 5 6 7 8 9 10 |
$data = array( 'Article' => array( 'user_id' => 1, 'published' => 1, 'slug' => 'new-article', 'title' => 'New Article', 'body' => 'New Body' ) ); $this->testAction('/articles/index', array('data' => $data, 'method' => 'post')); |
GETリクエストのシミュレート
1 2 3 4 5 6 7 |
$data = array( 'Post' => array( 'title' => 'New post', 'body' => 'Secret sauce' ) ); $this->testAction('/posts/add', array('data' => $data, 'method' => 'get')); |
アクションの結果を取得する
アクションの処理によって以下の情報が取得できる。
- vars – ビューの値
- view – レイアウト以外の描画されるビュー
- contents – レイアウトを含む描画されるビュー
- result – コントローラのアクションが返す値
アクションが成功したかチェックする
ビューに含まれる文字列を調べれば、期待したビューが表示されたかチェックできる
1 2 |
// テストケース $this->assertTextContains('登録画面', $this->view); |
ロケーションを調べれば、期待したリダイレクトが行われたかチェックできる
1 2 3 4 5 |
// コントローラ $this->redirect('/posts/results.'); // テストケース $this->assertRegExp("/results/", $this->headers["Location"]); |
変数を調べれば、コントローラが正しい変数をビューにセットしたかチェックできる
1 2 3 4 5 6 7 8 9 |
// コントローラ $this->set('value1', $value1); $this->set('value2', $value2); // テストケース $expected1 = 123; $expected2 = 456; $this->assertEqual($expected1, $this->vars['value1']); $this->assertEqual($expected2, $this->vars['value2']); |
セッション変数をしらべれば、コントローラが正しい値をセッションにセットしたかチェックできる
1 2 3 4 5 6 |
// コントローラ $this->Session->setFlash('登録成功'); // テストケース $flash = CakeSession::read('Message.flash'); $this->assertTextContains('登録成功', $flash['message']); |
参考サイト
[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