😀

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

2022/11/28に公開

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)

テストが動きました。

Discussion