EC-CUBE3のメモ - ユニットテスト -

[画面を作ってみる](http://qiita.com/chihiro-adachi/items/28af6e0b3837983515fe)
の続き。

画面ができたら、次はユニットテストを作ります。

# テスト範囲
[テストポリシー](https://github.com/EC-CUBE/ec-cube/wiki/%E3%83%86%E3%82%B9%E3%83%88%E3%83%9D%E3%83%AA%E3%82%B7%E3%83%BC)に記載がありますが、以下3つはテスト書くことが望ましい。（Serviceは常に必須）

* Routing
* Service
* FormType

でもそんなに難しくない。
テストは[tests](https://github.com/EC-CUBE/ec-cube/tree/eccube-3.0.0-beta/tests)ディレクトリにあります。

## Routingのテスト
コントローラ単位で作成。
tests/Eccube/Tests/Web/Admin/Basis/PointController.php

```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のテスト

```php
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 
```