例として、http://www.example.com/hoge/list を想定する。
テストコード内のRequestオブジェクトだけでは、RESTのフォーマットを定義することが出来ない模様。
( core/controller/rest.php の _detect_format() でフォーマットが判断されているので、詳細はソースを閲覧のこと )
一番簡単なのは、$_GETパラメータにformatを設定する方法だと思われる。
下記のコードでは、フォーマットがjsonのデータでアサーションすることを想定。
方法案
方法 | メリット | デメリット |
---|---|---|
$_GETパラメータでformatを設定する | 簡単 | リクエスト毎に設定する必要がある |
RestControllerのフォーマットを決め打ち | ソースが見やすい | URLでフォーマットを決めることが出来ない(list.json, list.xml も全て同じフォーマットになる) |
RestControllerのparam()メソッドを上書き | 影響範囲が不明 |
基本のコード
== Restコントローラー
<?php
class Controller_Hoge extends Controller_Rest
{
public function get_list()
{
$this->response( array("ooo") );
}
}
テストコード
<?php
class Test_Controller_Hoge extends \TestCase
{
protected function setUp()
{
parent::setUp();
}
protected function tearDown()
{
parent::tearDown();
}
public function test_index(){
$request = Request::forge('/hoge/list', true)->execute();
$response = $request->response();
$expect = '["ooo"]';
$this->assertEquals( $expect, $response->body );
}
}
各方法の実装
$_GETパラメータでformatを設定する
テストコードに、以下の様に $_GET
変数を設定する
<?php
class Test_Controller_Hoge extends \TestCase
{
protected function setUp()
{
parent::setUp();
}
protected function tearDown()
{
parent::tearDown();
}
public function test_index(){
$_GET = array( "format" => "json" );
$request = Request::forge('/hoge/list', true)->execute();
$response = $request->response();
$expect = '["ooo"]';
$this->assertEquals( $expect, $response->body );
}
}
RestControllerのparam()メソッドを上書き
Restコントローラーに、以下の様に param() メソッドを定義
<?php
class Controller_Hoge extends Controller_Rest
{
public function get_list()
{
$this->response( array("ooo") );
}
public function param( $param, $default = NULL ){
if( $param == "format" ){
return "xml";
}else{
return $parent::param( $param );
}
}
}
Restコントローラー内でフォーマットを固定してテストを行う
Restコントローラー内に、$format 変数を定義する
<?php
class Controller_Hoge extends Controller_Rest
{
protected $format = "json";
public function get_list()
{
$this->response( array("ooo") );
}
}