画面を作ってみる
の続き。
画面ができたら、次はユニットテストを作ります。
テスト範囲
テストポリシーに記載がありますが、以下3つはテスト書くことが望ましい。(Serviceは常に必須)
- Routing
- Service
- FormType
でもそんなに難しくない。
テストはtestsディレクトリにあります。
Routingのテスト
コントローラ単位で作成。
tests/Eccube/Tests/Web/Admin/Basis/PointController.php
namespace Eccube\Tests\Web;
use Silex\WebTestCase;
use Eccube\Application;
class PointControllerTest extends WebTestCase
{
public $app;
public function createApplication()
{
$app = new Application();
$this->app = $app;
$app['debug'] = true;
$app['session.test'] = true;
$app['exception_handler']->disable();
return $app;
}
public function testRoutingAdminBasisPoint()
{
$client = $this->createClient();
$crawler = $client->request('GET', '/admin/basis/point');
$this->assertTrue($client->getResponse()->isSuccessful());
}
}
createApplication
の部分は、初期化です。そのままコピペでよいでしょう。
実際のテストはtestRoutingAdminBasisPoint
です。
URLにアクセスし、レスポンスを確認する、という内容。厳密にはもっと色々必要ですが、まずはこれくらい。
Serviceのテスト
今回つくったポイント管理には、Serviceクラスはないので、今回はなし。
FormTypeのテスト
namespace Eccube\Tests\Form\Type;
use Symfony\Component\Form\Test\TypeTestCase;
class PointTypeTest extends TypeTestCase
{
/** @var \Eccube\Application */
private $app;
/** @var array デフォルト値(正常系)を設定 */
private $formData = array(
'point_rate' => 10,
'welcome_point' => 10,
);
public function setUp()
{
parent::setUp();
$this->app = new \Eccube\Application;
$this->app['debug'] = true;
$this->app['session.test'] = true;
$this->app['exception_handler']->disable();
// CSRF tokenを無効にしてFormを作成
$this->form = $this->app['form.factory']
->createBuilder('point', null, array(
'csrf_protection' => false,
))
->getForm();
}
public function testValidData()
{
$this->form->submit($this->formData);
$this->assertTrue($this->form->isValid());
}
public function testInvalidPointRate_NotBlank()
{
$this->formData['point_rate'] = '';
$this->form->submit($this->formData);
$this->assertFalse($this->form->isValid());
}
public function testInvalidPointRate_Min()
{
$this->formData['point_rate'] = -1;
$this->form->submit($this->formData);
$this->assertFalse($this->form->isValid());
}
public function testInvalidPointRate_Max()
{
$this->formData['point_rate'] = 101;
$this->form->submit($this->formData);
$this->assertFalse($this->form->isValid());
}
以下welcome_pointのテスト...
setupは、コントローラと同様、初期化処理。
それ以降は、フォームのバリデーションをテストしていきます。
- testValidData
- 期待する値が入ってきた際のテスト
- testInvalidPointRate_NotBlank
- 空白が投入された際のテスト
- testInvalidPointRate_Min
- 最小値チェック
- testInvalidPointRate_Max
- 最大値チェック
ユニットテストの実行
テストを作ったら、テストを実行します。
$ vendor/bin/phpunit (ec-cubeのルートディレクトリで実行)
PHPUnit 3.7.38 by Sebastian Bergmann.
The Xdebug extension is not loaded. No code coverage will be generated.
PHPUnit 3.7.38 by Sebastian Bergmann.
Configuration read from /vagrant/eccube3/phpunit.xml.dist
............
Time: 9.54 seconds, Memory: 14.25Mb
OK (7 tests, 7 assertions)
「OK」が表示され、グリーンになれば成功です。
上記の場合、すべてのテストが実行されるので、少し時間がかかります。
個別にテスト実行する場合は、以下のようにします。
$ vendor/bin/phpunit tests/Eccube/Tests/Form/Type/PointTypeTest.php