CakePHP 4 で別フォルダに置いたコントローラの自動テスト
はじめに
今日は前回「CakePHP 4 で一部のコントローラを別フォルダに設置する方法」の続きで、CakePHP 4 で別フォルダに設置したコントローラの自動テストの方法をご紹介します。
今回も CakePHP 4.1.5 (cakephp/app 4.1.1) を使用して確認しています。
1. 下準備
今回のファイル構成は以下のようになっています。
/path/to/cakephp4/
├ src/
│ ├ Ajax/
│ │ ├ AppController.php
│ │ └ SampleController.php
│ (他省略)
│
├ tests/
│ ├ TestCase/
│ │ ├ Ajax/
│ │ │ └ SampleControllerTest.php
(他省略)
前回のファイルを引き継いでいますので、詳細はそちらをご参照ください。
今回は src/Ajax/SampleController.php のテストを書きます。
内容は前回と同じですが、テストに関わってくる部分なので掲載しておきます。
<?php
declare(strict_types=1);
namespace App\Controller\Ajax;
class SampleController extends AppController
{
public function index()
{
$this->set('message', 'これはサンプルです');
$this->viewBuilder()
->setClassName('Json')
->setOption('serialize', ['message'])
->setOption('jsonOptions', JSON_FORCE_OBJECT);
}
}
2. テストの方法
実は、テストは特別な設定無しで書くことができました。
まずはテストコードを作ります。今回は下記のようにしました。
namespace は コントローラに則して App\Test\TestCase\Controller\Ajax にしています。
<?php
declare(strict_types=1);
namespace App\Test\TestCase\Controller\Ajax;
use Cake\TestSuite\IntegrationTestTrait;
use Cake\TestSuite\TestCase;
class SampleControllerTest extends TestCase
{
use IntegrationTestTrait;
public function testGet(): void
{
$this->configRequest([
'headers' => ['Accept' => 'application/json']
]);
$result = $this->get('/ajax/sample');
$this->assertResponseOk();
$expected = json_encode(['message' => 'これはサンプルです'], JSON_PRETTY_PRINT);
$this->assertEquals($expected, (string)$this->_response->getBody());
}
}
このコードは下記公式ドキュメントを参考にしています。そこにも記載がありますが、debug を無効にしてテストを行う場合は JSON_PRETTY_PRINT を外してください。
(外さないと FAILURES! になります)
- Testing a JSON Responding Controller (Testing - CakePHP 4.x Cookbook)
- https://book.cakephp.org/4/en/development/testing.html#testing-a-json-responding-controller
あとは下記コマンドなどでテストを実行してみてください。
$ cd /path/to/cakephp4
$ vendor/bin/phpunit tests/TestCase/Ajax/SampleControllerTest.php
# tests/TestCase/Ajax 内にある全テスト
$ vendor/bin/phpunit tests/TestCase/Ajax
# 全てのテスト
$ vendor/bin/phpunit
コードは割愛しますが、Fixture やデータベースを使ったテストも問題なく行えました。書き方は通常のコントローラの場合と相違ありません。
- Testing - CakePHP 4.x Cookbook
- https://book.cakephp.org/4/en/development/testing.html
3. おわりに
テストファイルもフォルダを変えているので composer.json への追記が必要かと思っていたのですが、特に設定することなく、すぐに動かすことができました。
自動テストは予算や納期の都合で書けないケースも多々ありますが、品質向上に繋がる技術なので、スキルは身に着けておくと良いのかなと考えています。
さて、残りは Bake ですね。次はそちらを試そうと思います。