コントローラのユニットテスト

コントローラテストの概要

tests/TestCase/Controller 配下に テストクラスの ファイルを作成する。以下はArticlesコントローラに対するテストクラスArticlesControllerTestクラスの作成例。

<?php
namespace App\Test\TestCase\Controller;

use Cake\ORM\TableRegistry;
use Cake\TestSuite\IntegrationTestTrait;
use Cake\TestSuite\TestCase;

class ArticlesControllerTest extends TestCase
{
    use IntegrationTestTrait;

    public $fixtures = ['app.Articles'];

    public function testIndex()
    {
        $this->get('/articles'); // GETリクエストを送信

        $this->assertResponseOk();
        // 他のアサート
    }

    public function testIndexQueryData()
    {
        $this->get('/articles?page=1');

        $this->assertResponseOk();
        // 他のアサート
    }

    public function testIndexPostData()
    {
        $data = [
            'user_id' => 1,
            'published' => 1,
            'slug' => 'new-article',
            'title' => 'New Article',
            'body' => 'New Body'
        ];
        $this->post('/articles', $data); // POSTリクエストを送信

        $this->assertResponseSuccess();
        $articles = TableRegistry::getTableLocator()->get('Articles');
        $query = $articles->find()->where(['title' => $data['title']]);
        $this->assertEquals(1, $query->count()); // 投稿できているかを検証
    }
}

get(), post(), put(), delete(), patch(), head(), options()メソッドによって、それぞれに対応するHTTPリクエストを送信することができる。

アサーションメソッド

以下のアサーションメソッドでレスポンスの検証を行うことができる。

<?php
// 2xx レスポンスコードをチェック
$this->assertResponseOk();

// 2xx/3xx レスポンスコードをチェック
$this->assertResponseSuccess();

// 4xx レスポンスコードをチェック
$this->assertResponseError();

// 5xx レスポンスコードをチェック
$this->assertResponseFailure();

// 指定したレスポンスコードをチェック。例: 200
$this->assertResponseCode(200);

// Location ヘッダーをチェック
$this->assertRedirect(['controller' => 'Articles', 'action' => 'index']);

// Location ヘッダーが設定されていないことをチェック
$this->assertNoRedirect();

// Location ヘッダーの一部をチェック
$this->assertRedirectContains('/articles/edit/');

// 3.7.0 で追加
$this->assertRedirectNotContains('/articles/edit/');

// レスポンスが空ではないことをアサート
$this->assertResponseNotEmpty();

// レスポンス内容が空であることをアサート
$this->assertResponseEmpty();

// レスポンス内容をアサート
$this->assertResponseEquals('Yeah!');

// レスポンス内容が等しくないことをアサート
$this->assertResponseNotEquals('No!');

// レスポンス内容の一部をアサート
$this->assertResponseContains('You won!');
$this->assertResponseNotContains('You lost!');

// 返されたファイルをアサート
$this->assertFileResponse('/absolute/path/to/file.ext');

// レイアウトをアサート
$this->assertLayout('default');

// テンプレートが表示されたかどうかをアサート
$this->assertTemplate('index');

// セッション内のデータをアサート
$this->assertSession(1, 'Auth.User.id');

// レスポンスヘッダーをアサート
$this->assertHeader('Content-Type', 'application/json');

// 3.7.0 で追加
$this->assertHeaderNotContains('Content-Type', 'xml');

// ビュー変数をアサート
$user =  $this->viewVariable('user');
$this->assertEquals('jose', $user->username);

// レスポンス内のクッキーをアサート
$this->assertCookie('1', 'thingid');

// コンテンツタイプをチェック
$this->assertContentType('application/json');