LoginSignup
7
8

More than 5 years have passed since last update.

FuelPHPのRESTコントローラーをPHPUnitでテストする方法

Posted at

例として、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") );
        }

}
7
8
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
7
8