もふもふ技術部

CakePHPのControllerの画面遷移のユニットテストってどうやるの


CakePHP(PHPUnit)でユニットテストを書いているのですが、コントローラーで意図したページに正しく画面遷移しているかどうかをテストしたくなり、どうやったら実現できるか試してみました。

例えば下記のページに遷移することをテストしたい場合。
itemsに関連するModel, Controller, Viewが存在する状態とします(今回はbakeで作った)。
cakephp_01

一般的かどうかはわかりませんが、返ってきたHTML文字列の中に「商品一覧画面」という文言が存在するかどうかで判定することにしました。

テストの実行は画面から確認します。

http://localhost/test.php

テストコード

まずはシンプルにこんな感じ。
これは$resultがnullなためFailedになります。

ItemsControllerTest.php

どうやらプロダクトコード側で$this->render()の結果をreturnしてあげればViewが返るみたいですね。

ItemsController.php

これでAssertionが通るのですが、一つ問題が。
この場合、Controllerの実装の全てに return $this->render() をやってあげなきゃいけないことです。

テストのためにコードを足すなんてことは本末転倒なので、これは避けたい。

下記のようにすればreturnせずにviewがとれるので、プロダクトコードに修正を入れる必要がなくなります。

ItemsControllerTest.php

redirectしている場合

続いてリダイレクトする場合のテストです。
今回は商品登録画面で登録に成功すると一覧画面にリダイレクトするという仕様でいきます。

商品登録画面
cakephp_02

redirectした場合もindexと同様にテスト出来るかと思ったけどダメでした。
postするtestActionを実行してみる。パジェロ欲しかったけどタワシならもらえそうです。

ItemsController.php

ItemsControllerTest.php

これは、$this->viewがブランクで返ってくるためFailedになります。
redirectの場合はviewがとれないもんなのかな。

viewがとれそうもなかったのですが、レスポンスヘッダーが取れるみたいなので、urlのlocationでリダイレクト先を確認することにしました。
と同時に、登録完了時の文言がflashされているのでそれもテストします。

ItemsControllerTest.php

これでControllerのリダイレクト時の遷移もテスト出来ていると言えるのではないでしょうか。
もっとテストをサクサクかけるようになりたいですね!

The following two tabs change content below.
原田 敦

原田 敦

日本CAWのエンジニア。もふもふ部の部長。得意分野はRuby on Railsを使った小規模WEBアプリケーションを高速で開発すること。週末の楽しみは一人お菓子パーティー。三度の飯より小動物をもふもふするのが好きです。