CakePHP 4 で別フォルダに置いたコントローラの自動テスト

はじめに

今日は前回「CakePHP 4 で一部のコントローラを別フォルダに設置する方法」の続きで、CakePHP 4 で別フォルダに設置したコントローラの自動テストの方法をご紹介します。

今回も CakePHP 4.1.5 (cakephp/app 4.1.1) を使用して確認しています。

目次
  1. 下準備
  2. テストの方法
  3. おわりに

1. 下準備

今回のファイル構成は以下のようになっています。

/path/to/cakephp4/
  ├ src/
  │  ├ Ajax/
  │  │  ├ AppController.php
  │  │  └ SampleController.php
  │  (他省略)
  │
  ├ tests/
  │  ├ TestCase/
  │  │  ├ Ajax/
  │  │  │  └ SampleControllerTest.php
   (他省略)

前回のファイルを引き継いでいますので、詳細はそちらをご参照ください。

今回は src/Ajax/SampleController.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 にしています。

/tests/TestCase/Ajax/SampleControllerTest.php
<?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! になります)

あとは下記コマンドなどでテストを実行してみてください。

$ 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 やデータベースを使ったテストも問題なく行えました。書き方は通常のコントローラの場合と相違ありません。

3. おわりに

テストファイルもフォルダを変えているので composer.json への追記が必要かと思っていたのですが、特に設定することなく、すぐに動かすことができました。

自動テストは予算や納期の都合で書けないケースも多々ありますが、品質向上に繋がる技術なので、スキルは身に着けておくと良いのかなと考えています。

さて、残りは Bake ですね。次はそちらを試そうと思います。