端くれプログラマの備忘録 CakePHP [CakePHP] コントローラのテストの書き方の基礎

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

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

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

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

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

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

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

testActionで出来ること

アクションの呼び出し

$result = $this->testAction('/articles/index');

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

$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リクエストのシミュレート

$data = array(
    'Post' => array(
        'title' => 'New post',
        'body' => 'Secret sauce'
    )
);
$this->testAction('/posts/add', array('data' => $data, 'method' => 'get'));

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

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

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

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

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

// テストケース
$this->assertTextContains('登録画面', $this->view);

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

// コントローラ
$this->redirect('/posts/results.');

// テストケース
$this->assertRegExp("/results/", $this->headers["Location"]);

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

// コントローラ
$this->set('value1', $value1);
$this->set('value2', $value2);

// テストケース
$expected1 = 123;
$expected2 = 456;
$this->assertEqual($expected1, $this->vars['value1']);
$this->assertEqual($expected2, $this->vars['value2']);

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

// コントローラ
$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