Helperクラスのメソッド内で$this->request->$methodName()等を使い、URLのクエリパラメータを拾うような実装に対してテストコードを書く方法。検証したCakePHPのバージョンは3.6.13。
例として、$this->request->getQuery()を使ったメソッドを準備:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 |
<?php namespace App\View\Helper; use Cake\View\Helper; use Cake\View\View; class QueryParameterHelper extends Helper { /** * 指定したクエリパラメータが存在したら、 * そのクエリパラメータを付与したURLを生成 */ public function extractToUrl($name) { if (empty($name) || empty($this->request->getQuery($name))) { return ''; } return '?' . $name . '=' . $this->request->getQuery($name); } } |
このクラスに対するテストコードは下記のように書ける:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 |
<?php namespace App\Test\TestCase\View\Helper; use App\View\Helper\QueryParameterHelper; use Cake\TestSuite\TestCase; use Cake\View\View; use Cake\Http\ServerRequest; /** * App\View\Helper\QueryParameterHelper Test Case */ class QueryParameterHelperTest extends TestCase { /** * Test subject * * @var \App\View\Helper\QueryParameterHelper */ public $QueryParameterHelper; /** * setUp method * * @return void */ public function setUp() { parent::setUp(); $request = new ServerRequest(['url' => 'hoge/fuga?param=hogehoge']); $view = new View($request); $this->QueryParameterHelper = new QueryParameterHelper($view); } /** * tearDown method * * @return void */ public function tearDown() { unset($this->QueryParameterHelper); parent::tearDown(); } /** * Test extractToUrl method * * @return void */ public function testExtractToUrl() { // 何も渡さない $expected = ''; $this->assertEquals($expected, $this->QueryParameterHelper->extractToUrl('')); // 存在しないクエリパラメータ $expected = ''; $this->assertEquals($expected, $this->QueryParameterHelper->extractToUrl('fugafuga')); // 存在するクエリパラメータ $expected = '?param=hogehoge'; $this->assertEquals($expected, $this->QueryParameterHelper->extractToUrl('param')); } } |
解説
大きなポイントが2つある。
TemplateファイルやHelperクラスのメソッド内で呼び出すことができる$this->requestオブジェクトの正体は、 ServerRequestクラスのインスタンスである。そしてViewクラスをnewでインスタンス化する際、ServerRequestインスタンスを渡すことができるようになっている。
このServerRequestインスタンスは生成時にURL情報を引き渡すことが可能で、 これによりHelperクラス内のメソッドにて$this->requestからURL情報を取得できるようになる。詳細はCakePHP3のスケルトンにあるViewクラスの__construct()を参照していただきたい。