前回はSilexのCRUDアプリを作成しました。
-
Symfony勉強会 #6 Silexチュートリアル
先日、Symfony勉強会 #6 Silexワークショップに参加しました。 Silexは全くの初心者だった私ですが、ワー ...
続きを見る
今回はこのアプリをファンクショナルテストでガードします。
目次
PHPUnitのダウンロード
PHPUnitはPEARからインストールしても良いですが、せっかくなので、composerからダウンロードしてみます。ファンクショナルテストに必要なSymfonyコンポーネントも一緒にダウンロードします。
composer.jsonを下記のように編集します。
{
"repositories": [
{
"type": "pear",
"url": "http://pear.symfony-project.com"
},
{
"type": "pear",
"url": "http://pear.phpunit.de"
}
],
"minimum-stability": "dev",
"require": {
"silex/silex": "1.0.*",
"twig/twig": "1.8.*",
"doctrine/dbal": "2.2.*",
"doctrine/common": "2.2.*",
"pear-phpunit/PHPUnit": "*",
"symfony/browser-kit": "2.1.*",
"symfony/dom-crawler": "2.1.*",
"symfony/css-selector": "2.1.*"
}
}
下記コマンドを実行してダウンロードします。
php composer.phar upate
ファンクショナルテストの記述
vendorと同じ階層にtestsフォルダを作成し、テストコードを記述します。
silex/tests/functional/MemberControllerTest.php
<?php
require_once __DIR__.'/../../vendor/autoload.php';
use Silex\WebTestCase;
class MemberControllerTest extends WebTestCase
{
private $db;
private $member;
public function __construct()
{
$app = new Silex\Application();
$app->register(new Silex\Provider\DoctrineServiceProvider(), array(
'db.options' => array(
'driver' => 'pdo_mysql',
'dbname' => 'silex',
'host' => 'localhost',
'user' => 'admin',
'password' => 'admin'
),
));
$this->db = $app['db'];
$this->db->exec("TRUNCATE TABLE member");
}
public function createApplication()
{
require __DIR__ . '/../../web/index.php';
$app['debug'] = true;
unset($app['exception_handler']);
return $app;
}
public function testMemberRegistration()
{
$client = $this->createClient();
$crawler = $client->request('GET', '/silex/web/member/register');
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertSame(1, $crawler->filter('title:contains("会員登録")')->count());
$form = $crawler->filter('#register_submit')->form();
$data = array(
'member[email]' => 'sample@example.com',
'member[password]' => 'sample',
);
$crawler = $client->submit($form, $data);
$this->assertTrue($client->getResponse()->isSuccessful());
$this->assertSame(1, $crawler->filter('title:contains("会員登録完了")')->count());
}
}
PHPUnit実行ファイルを作成
PHPUnitの実行ファイルをvendorと同じ階層に作成します。
#!/usr/bin/env php
<?php
require_once __DIR__.'/vendor/autoload.php';
$paths = get_include_path();
foreach (glob(__DIR__.'/vendor/pear-phpunit/*') as $path) {
$paths .= PATH_SEPARATOR . $path;
}
set_include_path($paths);
require_once 'PHPUnit/Autoload.php';
PHPUnit_TextUI_Command::main();
phpunit.xml.distを作成
phpunit.xml.distをvendorと同じ階層に作成します。
<?xml version="1.0" encoding="UTF-8"?>
<phpunit backupGlobals="false"
backupStaticAttributes="false"
colors="false"
convertErrorsToExceptions="true"
convertNoticesToExceptions="true"
convertWarningsToExceptions="true"
processIsolation="false"
stopOnFailure="false"
syntaxCheck="false"
>
<testsuites>
<testsuite name="Project Test Suite">
<directory>./tests</directory>
</testsuite>
</testsuites>
</phpunit>
index.phpにルーティングの作成
なぜか / のルーティングが存在しないとエラーが出るので作成します。
// ...
$app->get('/', function() use($app) {
});
// ...
動作確認
作成したPHPUnit実行ファイルを下記のように実行します。
cd silex
phpunit
phpunitコマンドの引数にファイルを指定すると、そのテストだけ実行、省略するとすべてのテストが実行されます。phpunit.xml.distは同じ階層にあるので自動で読み込まれます。
実行結果は下記のようになります。
PHPUnit 3.6.10 by Sebastian Bergmann.
Configuration read from /Users/karasawa/Sites/silex/phpunit.xml.dist
.
Time: 0 seconds, Memory: 11.25Mb
OK (1 test, 4 assertions)
ディレクトリ構成
ディレクトリ構成は下記になります。参考までに。
silex
├── composer.json
├── composer.lock
├── composer.phar
├── phpunit
├── phpunit.xml.dist
├── tests
│ └── functional
│ └── MemberControllerTest.php
├── vendor
├── views
│ └── member
│ ├── finish.html.twig
│ └── register.html.twig
└── web
└── index.php
次回はリファクタリングです。
-
Symfony勉強会 #6 Silexチュートリアル リファクタリング
前回は、CRUDアプリをファンクショナルテストでガードしました。 今回は、index.phpに集中しているロジックをMV ...
続きを見る