4.7.8 ウェブテスト - ビューのテスト

CakePHP でのプロジェクトは、ほとんど全てがウェブアプリケーションです。単体テストにおいて、小分けにした機能のテストがうまくいったら、それより大きなスケールでの機能をテストしたくなるでしょう。「CakeWebTestCase」クラスは、ユーザの視点からこのテストを行う優れた方法を提供します。

4.7.8.1 CakeWebTestCase について

CakeWebTestCase は、SimpleTest の WebTestCase をただ拡張したもので、特に機能追加はありません。SimpleTest の Web testing に関する文書中に記載がある全ての機能は、 CakeWebTestCase で利用できます。これはまた、 SimpleTest が持つ機能以外のものは使えないことを意味します。すなわち、 CakeWebTestCase においてフィクスチャは利用できず、テストケースにデータベースに対する更新や保存が含まれていた場合、恒久的にデータベースの値が変更されることを意味します。テストの結果は、しばしばデータベースが持つ値に基づくので、テスト手順の一部としてデータベースが期待した値を持つことを確認してください。

4.7.8.2 テストの作成

ウェブテストを実行したい場合、まず CakeTestCase の代わりに CakeWebTestCase を拡張したクラスを必ず用意してください。

class CompleteWebTestCase extends CakeWebTestCase
  1. class CompleteWebTestCase extends CakeWebTestCase

テストを開始する前に何か準備を行う必要があれば、コンストラクタを作成してください。

function CompleteWebTestCase(){
  //テスト開始前の準備をここで行う
}
  1. function CompleteWebTestCase(){
  2. //テスト開始前の準備をここで行う
  3. }

実際にテストケースを書く場合、まずは出力結果を取得することから始めます。出力結果を得るためには get もしくは post のリクエストを行うのですが、これには get() post() 関数をそれぞれ使用します。これらの関数は両方とも、第一引数として完全な URL を必要とします。URL は、もしテストのスクリプトが http://ドメイン名/cake/folder/webroot/test.php であるとすると、次のようにすることで動的に取得できます。

$this->baseurl = current(split("webroot", $_SERVER['PHP_SELF']));
  1. $this->baseurl = current(split("webroot", $_SERVER['PHP_SELF']));

Cake 流の URL を用いて get や post を行うには、次のようにします。

$this->get($this->baseurl."/products/index/");
$this->post($this->baseurl."/customers/login", $data);
  1. $this->get($this->baseurl."/products/index/");
  2. $this->post($this->baseurl."/customers/login", $data);

post メソッドの第二引数 $data は、Cake フォーマットのデータを含む、 post するデータを連想配列にしたものです。

$data = array(
  "data[Customer][mail]" => "user@user.com",
  "data[Customer][password]" => "userpass");
  1. $data = array(
  2. "data[Customer][mail]" => "user@user.com",
  3. "data[Customer][password]" => "userpass");

ページをリクエストしたら、標準的な SimpleTest ウェブテストのメソッドを用いて、全ての種類のアサーションを行うことが可能です。

4.7.8.3 ページ全体を確認する

CakeWebTest は、ハイパーリンクや画像をクリックすることでページ全体をナビゲートする手段も提供します。詳しくは、 SimpleTest の文書を参照してください。