Help us understand the problem. What is going on with this article?

FuelPHP【チュートリアル】-- コントローラーのテストの方法 --

More than 5 years have passed since last update.

FuelPHPのコントローラーのテストの書き方がなかったので試して見た

環境

  • centos6.3
  • fuelPHP1.5.3

事前準備に必要なもの

参考にしたサイト

testコントローラーの配置場所

デフォルトでfuel/app/tests/controllerのディレクトリが作成済みですのでそこにコントローラーのテストクラスを作成していきます。

fuel/app/tests
      ├── controller
      │   └── auth.php
      ├── model
      └── view

コントローラー側

コントローラー側でテストをする際はView側にアサインした値の検証が出来れば大体のことはテストできると思います。そこでこんなサンプルを作ります。

fuel/app/classes/controller/hoge.php
<?php

class Controller_Hoge extends Controller_Hybrid
{
    public function before()
    {
        parent::before();
    }

    public function action_fuga()
    {
        $this->template->title = 'htmlでのtitileタグ';
        $this->template->content = View::forge('hoge/fuga');
        //CSSを追加する
        $this->template->add_css = array('hoge.css');
    }   
}

コントローラーテストクラスの作成

コントローラーの雛形です。

fuel/app/tests/controller/hoge.php
/**
 * Tests for hoge
 *
 * @group App
 * @group Controller
 * @group Hoge
 */
class Test_Controller_Hoge extends TestCase
{
    public function setup()
    {

    }
}

値を検証する方法

先ほど作ったController_Hogeのadd_cssの値を検証する場合

fuel/app/tests/controller/hoge.php
    /**
     * @test
     * @group hogecontroller
     **/
    public function test_add_cssの値が入っているか確認する()
    {
        $expected = array('hoge.css');

        $response = Request::forge('hoge/fuga')
                             ->execute()
                             ->response();

        $assertValue = $response->body->add_css;

        $this->assertSame($expected, $assertValue);
    }

上記でoilコマンドを実行すればOKが返ってきます

php oil t --group=hogecontroller

Tests Running...This may take a few moments.
PHPUnit 3.7.18 by Sebastian Bergmann.

Configuration read from /home/web/lo.fuel.base.org/fuel/app/phpunit.xml

.

Time: 0 seconds, Memory: 5.25Mb

OK (1 test, 1 assertion)

controller内でのRedirect()を実行の場合

FuelPHPではRedirect()を実行するとexitが入っていてテスト自体も止まってしまいます

fuel/app/classes/controller/hoge.php
<?php

class Controller_Hoge extends Controller_Hybrid
{
    public function action_fugaredirect()
    {
        $this->template->is_error = true;
        //Response::redirectの中身でexitを実行しているので止まってしまう
        return Response::redirect('error/404');
    }
}

fuel/core/response.php

fuel/core/classes/response.php
    public static function redirect($url = '', $method = 'location', $code = 302)
    {
        $response = new static;

        $response->set_status($code);

        if (strpos($url, '://') === false)
        {
            $url = $url !== '' ? \Uri::create($url) : \Uri::base();
        }

        strpos($url, '*') !== false and $url = \Uri::segment_replace($url);

        if ($method == 'location')
        {
            $response->set_header('Location', $url);
        }
        elseif ($method == 'refresh')
        {
            $response->set_header('Refresh', '0;url='.$url);
        }
        else
        {
            return;
        }

        $response->send(true);
        exit; ##<= テストを止めてしまう
    }

そこでresponse.phpを独自のpackageで作成してテストのときは止めないようにしてみましょう。

fuel/packages/my/classes/response.php
namespace My;

class Response extends \Fuel\Core\Response
{
    /**
     * Override Fuel\Core\Response redirect method
     *
     * @param   string  $url     The url
     * @param   string  $method  The redirect method
     * @param   int     $code    The redirect status code
     *
     * @return  void
     */
    public static function redirect($url = '', $method = 'location', $code = 302)
    {
        $response = new static;
        $response->set_status($code);

        if (strpos($url, '://') === false)
        {
            $url = $url !== '' ? \Uri::create($url) : \Uri::base();
        }

        strpos($url, '*') !== false and $url = \Uri::segment_replace($url);

        if ($method == 'location')
        {
            $response->set_header('Location', $url);
        }
        elseif ($method == 'refresh')
        {
            $response->set_header('Refresh', '0;url='.$url);
        }
        else
        {
            return;
        }

        //テストではない場合はexitを実行
        if (\Fuel\Core\Fuel::$env != 'test')
        {
            $response->send(true);
            exit;
        }

        $response->send(true);
    }
}

そしてこのクラスをロードするようにfuel/app/config/config.phpに追加します

fuel/app/config/config.php
        'packages'  => array(
            'my', //追加する
        ),

redirectを実行したコントローラーのテストを実行してみる

先ほどのコントローラーでアサインしたis_errorでアサートできるかテストを書いてみましょう

コントローラー側

fuel/app/classes/controller/hoge.php
<?php

class Controller_Hoge extends Controller_Hybrid
{
    public function action_fugaredirect()
    {
        $this->template->is_error = true;
        return Response::redirect('error/404');
    }
}

テスト側

fuel/app/tests/controller/hoge.php
    /**
     * @test
     * @group hogeredirect
     **/
    public function test_is_errorがtrueか()
    {
        $expected = true;

        $_GET = array('username' => 'hoge', 'password' => 'huga');
        $response = Request::forge('auth/account')
                           ->execute()
                           ->response();

        $assertValue = $response->body->is_error;
        $this->assertSame($expected, $assertValue);
    }

テスト実行

php oil t --group=hogeredirect

Tests Running...This may take a few moments.
PHPUnit 3.7.18 by Sebastian Bergmann.

Configuration read from /home/web/lo.fuel.base.org/fuel/app/phpunit.xml

.

Time: 0 seconds, Memory: 5.25Mb

OK (1 test, 1 assertion)

テストが動きました。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away