テーブルクラスのテスト

Articleテーブルのテスト。公開済みの記事を取得するfindPublished()メソッドを持つ。

<?php
namespace App\Model\Table;

use Cake\ORM\Table;
use Cake\ORM\Query;

class ArticlesTable extends Table
{
    public function findPublished(Query $query, array $options)
    {
        $query->where([
            $this->alias() . '.published' => 1
        ]);
        return $query;
    }
}

tests/TestCase/Table配下にテーブルテストクラスのファイルを作成する。

<?php
namespace App\Test\TestCase\Model\Table;

use App\Model\Table\ArticlesTable;
use Cake\ORM\TableRegistry;
use Cake\TestSuite\TestCase;

class ArticlesTableTest extends TestCase
{
    public $fixtures = ['app.Articles'];
}

テストメソッドの作成

テストメソッドtestFindPublished()でArticleTableのfindPublished()関数をテストする。assertEquals($expected, $result)メソッドで取得結果が期待される値と合致するか検証する。

<?php
class ArticlesTableTest extends TestCase
{
    public $fixtures = ['app.Articles'];

    public function setUp()
    {
        parent::setUp();
        $this->Articles = TableRegistry::getTableLocator()->get('Articles');
    }

    public function testFindPublished()
    {
        $query = $this->Articles->find('published'); // 公開済みの記事を取得する
        $this->assertInstanceOf('Cake\ORM\Query', $query); // Queryクラスのインスタンスであることを検証
        $result = $query->enableHydration(false)->toArray();
        //  期待される値
        $expected = [
            ['id' => 1, 'title' => 'First Article'], 
            ['id' => 2, 'title' => 'Second Article'],
            ['id' => 3, 'title' => 'Third Article']
        ];

        $this->assertEquals($expected, $result); // 期待される値と合致するか検証
    }
}

モデルメソッドのモック化

getMockForModel('モデル名', ['メソッド'])でテーブルクラスのモックを作成できる。

<?php
public function testFindPublished()
{
    $mock = $this->getMockForModel('Article', ['findPublished']);
    $mock->expects($this->once()) // 呼ばれる回数
        ->method('findPublished') // 対象のメソッド
        ->will($this->returnValue($expected)); // 期待される戻り値

    // 実行
    $result = $mock->findPublished(array('id', 'title'));
}

findPublishedメソッドを呼び出す対象のモックを作成し、期待される戻り値等を設定してから実行している。