テーブルクラスのテスト
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メソッドを呼び出す対象のモックを作成し、期待される戻り値等を設定してから実行している。