コントローラのユニットテスト
コントローラテストの概要
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');