コントローラークラスのテスト
CakePHPではIntegrationTestCase
クラスを使うとコントローラーを通したテストができる。複数のクラスが連動した動きになるので、WebIFレベルのテストが可能になる
基本
認証が必要ないアクションのテスト
http://<domain>/articles
にGETメソッドを送信
class ArticlesControllerTest extends IntegrationTestCase
{
public $fixtures = ['app.articles'];
public function testIndex()
{
$this->get('/articles');
$this->assertResponseOk();
}
}
同じような使い方で各種HTTPメソッドをリクエストすることができる。
HTTPボディ部があるメソッドの場合は第二引数で連想配列を設定する。
認証が必要なアクションのテスト
CakePHPのAuthComponent
を使った認証を実装している場合、HTTPリクエストの送信前に以下をテストメソッド内で設定する。
※但し、フィクスチャ(テスト時に利用されるDBのダミーデータ)にid=1
のユーザーが存在している必要がある。
public function testIndex()
{
$this->session([
'Auth' => [
'User' => [
'id' => 1,
],
],
]);
$this->get('/articles');
$this->assertResponseOk();
}
AuthComponentの補足
デフォルトでUsersTableの情報を認証情報のデータとして扱うため、上記でUser
を指定している。
異なるテーブルを認証情報としている場合、User
を異なるモデル名に変更すれば行ける。多分。
CSRF対策をしているアクションのテスト
CakePHPのCSRFを利用している場合、テストメソッド内で以下を設定する。
public function testIndex()
{
$this->enableCsrfToken();
$this->get('/articles');
$this->assertResponseOk();
}
認証+CSRF対策をしているアクションのテスト
これまでの話をまとめて。
public function testIndex()
{
$this->enableCsrfToken();
$this->session([
'Auth' => [
'User' => [
'id' => 1,
],
],
]);
$this->get('/articles');
$this->assertResponseOk();
}
所感
便利なものはだいたい用意されてるので楽ですね。
WebIFベースでTDDしても効率良くないかも。PHPUnit見てもモデル原因のエラーは分からない事が多い。
参考