http://madroom-project.blogspot.jp/2014/03/phalcon_1056.html
ディレクトリ構造とかは、適当に作っているオレオレPhalconを御覧ください。
http://madroom-project.blogspot.jp/2014/03/phalcon_21.html
https://github.com/mamor/phalcon-myapp
以下にPhalcon用の便利ツールっぽいものもあるのですが、今回は使わずにやってみます。
https://github.com/phalcon/incubator
まず app/bootstrap/helper.php を作成して、ヘルパ関数を作ってみました。di()は、Phalcon\DI\FactoryDefaultのインスタンスを返します。
<?php
use Phalcon\DI;
/**
* @return Phalcon\DI\FactoryDefault
*/
function di()
{
static $di = null;
if (is_null($di)) {
$di = (new DI)->getDefault();
}
return $di;
}
このファイルは app/bootstrap/bootstrap.php で読み込みます。require_once __DIR__.'/helper.php';
次に composer.jsonに "phpunit/phpunit" と "mockery/mockery" と、この後作成する "app/tests/TestCase.php" を追加して composer update します。Mockeryは無くても良いですが、PHPUnitよりも少し簡単にモックが書けます。
{
+ "require-dev": {
+ "phpunit/phpunit": "4.*",
+ "mockery/mockery": "0.*"
+ },
"autoload": {
+ "classmap": [
+ "app/tests/TestCase.php"
+ ],
"psr-0": {
"Core": "app/classes",
"App": "app/classes"
app/tests/TestCase.php を作成します。この後に作成するテストクラスの基底クラスになります。setMockToDI()は依存注入用メソッドです。
<?php
/**
* Class TestCase
*/
abstract class TestCase extends \PHPUnit_Framework_TestCase {
/**
* @param string $name
* @param mixed $mock
* @param bool $shared
*/
protected function setMockToDI($name, $mock, $shared = null)
{
di()->set($name, function () use ($mock) {
return $mock;
}, $shared);
}
}
プロジェクトルートに phpunit.xml を作成します。 http://docs.phalconphp.com/en/1.2.6/reference/unit-testing.html を基にしました。
<?xml version="1.0" encoding="UTF-8"?> <phpunit bootstrap="./app/tests/bootstrap.php" backupGlobals="false" backupStaticAttributes="false" verbose="true" colors="true" convertErrorsToExceptions="true" convertNoticesToExceptions="true" convertWarningsToExceptions="true" processIsolation="false" stopOnFailure="false" syntaxCheck="true"> <testsuite name="Phalcon - Testsuite"> <directory>./app/tests/</directory> </testsuite> </phpunit>
app/tests/bootstrap.php を作成します。composer の autoload.php と、前述のヘルパファイルを読み込んでいます。
<?php include __DIR__ . '/../../vendor/autoload.php'; require_once __DIR__.'/../bootstrap/helper.php';
app/tests/ の下に、名前空間とかを加味して、テストクラスを作成します。今回は app/tests/Core/Filter/AjaxFilterTest.php としています。内容の細かいことは最後に書きます。
<?php namespace Core\Filter;
use Mockery as m;
/**
* Class AjaxFilterTest
*/
class AjaxFilterTest extends \TestCase {
/**
* test for filter()
*/
public function testFilter() {
$m = m::mock();
$m->shouldReceive('getServer')->once()->with('X_REQUESTED_WITH')->andReturn('xmlhttprequest');
$this->setMockToDI('request', $m);
$this->assertTrue((new AjaxFilter)->filter());
}
/**
* test for filter()
*/
public function testFilterFailed() {
$m = m::mock();
$m->shouldReceive('getServer')->once()->with('X_REQUESTED_WITH')->andReturn(null);
$this->setMockToDI('request', $m);
$this->assertFalse((new AjaxFilter)->filter());
}
}
phpunitを実行してみます。
$ phpunit PHPUnit 4.0.12 by Sebastian Bergmann. Configuration read from /share/phalcon_project/phpunit.xml .. Time: 302 ms, Memory: 6.00Mb OK (2 tests, 2 assertions)
AjaxFilterTestクラスでは、Mockeryのモックオブジェクトを作成しています。このモックオブジェクトを、基底テストクラスのsetMockToDI()メソッドに渡して依存注入して、AjaxFilter#filter()におけるgetServer()をコントロールしている感じです。
もっと良い方法あれば教えて下さいm(_ _)m (Phalcon\DI\Injectableとか上手く使えないかな。。。)
No comments:
Post a Comment