リクエストに関するテスト
Zend Frameworkを利用する上で任意のアクション、コントローラを使用しているかを把握することは大切であり、それらを確認するために以下のメソッドが用意されています。
| メソッド名 | 引数 | 説明 |
| assertModule | $module | 使用されたモジュールが$moduleであるかどうかを検証 |
| assertController | $controller | ディスパッチされたアクションコントローラが$controllerであるかどうかを検証 |
| assertAction | $action | 使用されたアクションが$actionであるかどうかを検証 |
| assertRoute | $route | $routeがルータでマッチしたかどうかを検証 |
IndexControllerTest.phpにこれらを使用したテストを記述していきます。「http://localhost/index/index」にアクセスされることを確認するテストです。
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
...
public function testRequest() {
$this->dispatch('/');
$this->assertController('index');// (1)
$this->assertAction('index');// (2)
$this->assertModule('default');// (3)
$this->assertRoute('default');// (4)
}
}
まずメソッドの1行目でルートをディスパッチしています。このようにコントローラ、アクションを省略して記述したときはそれぞれ「index」が使用されます。そのため(1)で「IndexController」が使用されていることを確認できます。同じように(2)では「indexAction」が使用されていることを確認できます。「$this->dispatch('index/login');」のようにディスパッチすると「loginAction」が使用されるのでテストに通らなくなります。(3)、(4)は何も設定していないため'default'のままであることが確認できます。
リダイレクトに関するテスト
Zend_Testには任意のリダイレクトが正しく行われているかを確認する以下のメソッドが用意されています。
| メソッド名 | 引数 | 説明 |
| assertRedirect | - | リダイレクトが行われるかどうかを検証 |
| assertRedirectTo | $url | リダイレクトが行われ、リダイレクト先が$urlとマッチするかどうかを検証 |
| assertRedirectRegex | $pattern | リダイレクトが行われ、リダイレクト先が正規表現$patternにマッチするかどうかを検証 |
リダイレクトが行われていることを仮定したテストを記述していきます。「http://google.com/」にリダイレクトされることを複数のテストから確認したいと思います。
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
...
public function testRedirect() {
$this->dispatch('index/redirect');
$this->assertRedirect();// (1)
$this->assertRedirectTo('http://google.com/');// (2)
$this->assertRedirectRegex('{.+\.com\/}');// (3)
}
}
(1)はリダイレクトが行われているかの確認です。(2)はさらにリダイレクト先が「http://google.com/」であるか確認しています。(3)は上記で紹介した正規表現で指定しています。それでは実際に「http://google.com/」にリダイレクトするアクションを作成してみましょう。
<?php
class IndexController extends Zend_Controller_Action
{
...
public function redirectAction() {
$this->_redirect('http://google.com/');
}
}
「http://localhost/index/redirect」にアクセスすると「http://google.com/」にリダイレクトされます。(1)~(3)のすべての条件を満たすようになりました。このようにリダイレクトが行われているかどうか、そしてそのリダイレクト先を確認することができます。
ヘッダに関するテスト
ヘッダにはWebページの情報を示す重要なデータが含まれているため、正しい情報を含んでいるかを確認することはとても有効なことです。以下はヘッダの内容を確認するためのメソッドです。
| メソッド名 | 引数 | 説明 |
| assertResponseCode | $code | HTTPステータスコードが$codeと一致しているかどうかを検証 |
| assertHeader | $header | $headerで指定されたヘッダがあるかどうかを検証 |
| assertHeaderContains | $header, $match | $headerで指定されたヘッダが$matchにマッチしているかどうかを検証 |
| assertHeaderRegex | $header, $pattern | $headerで指定されたヘッダが正規表現$patternにマッチするかどうかを検証 |
HTTPステータスコードとは、100番台は「information」、200番台は「Sucsess」、300番台は「Redirect」、400番台は「Client Error」、500番台は「Server Error」というようにHTTPプロトコルで通信しているときの状態を番号で表しています。
上記のメソッドを使用しヘッダの内容を確認するテストを記述していきます。
class IndexControllerTest extends Zend_Test_PHPUnit_ControllerTestCase
{
...
public function testHeader() {
$this->dispatch('index/header');
$this->assertResponseCode(301);// (1)
$this->assertHeader('location');// (2)
}
}
(1)はHTTPステータスコードが301かどうかを確認し、(2)ヘッダに「location」要素が含まれいるかを確認しています。デフォルトではHTTPコードが200になっていて、ヘッダに「location」要素も含んでいません。これらのテストに通るようにヘッダを書き換えた「headerAction」を作成します。
<?php
class IndexController extends Zend_Controller_Action
{
...
public function headerAction() {
$res = $this->getResponse();
$res->setHttpResponseCode(301);// (1)
$res->setHeader('location', 'http://google.com/');// (2)
}
}
「http://localhost/index/header」にアクセスすると「http://google.com/」にリダイレクトされます。
上記のリダイレクトメソッドを使用したときと動作は同じですが今回はヘッダを変更することで実現しています。
(1)でHTTPステータスコードをデフォルトで設定されている200から恒久的移動をあらわす301に変更しています。さらに(2)でヘッダに「location」要素を追加し、内容を「http://google.com/」にすることでリスト7と同じようにリダイレクトしています。これによってテストの内容を満たすことができています。
おわりに
今回は、テスト記述、それに対応するアプリケーション記述を通して、テストにどのような条件を記述できるかについて紹介してきました。出力内容からヘッダの内容まで、Webアプリケーションをテストするための基本的なメソッドが揃っていることが確認できたと思います。
次回はデータベースをテストする方法について解説する予定です。データベースのテストは、データベースのセットアップや内容の確認など、面倒な点がありますが、Zend_Test_PHPUnit_Dbクラスを利用することで、テストの記述を容易にすることができます。
