🍨

ec-cube4でFormTypeをカスタマイズしたときのテストクラス

2023/10/03に公開

ec-cube4で画面拡張するときに使うAbstractTypeExtensionを継承したクラスのテストクラスを作成する場合に一手間必要だったので記事にしました。

環境

ec-cube 4.2.2

対象者

ec-cube4で画面の項目をカスタマイズして、そのクラスをPHPUnitでテストしたい人を対象にしています。
FormType自体のカスタマイズ方法は説明しませんので公式マニュアルをどうぞ。

FormTypeのテストクラス

例えばMailTypeを拡張したMailTypeExtensionを作ったとする。

MailTypeExtension.php
<?php

namespace Customize\Form\Extension;

use Eccube\Common\EccubeConfig;
use Eccube\Form\Type\Admin\MailType;
use Eccube\Form\Validator\Email;
use Symfony\Component\Form\AbstractTypeExtension;
use Symfony\Component\Form\Extension\Core\Type\EmailType;
use Symfony\Component\Form\FormBuilderInterface;
use Symfony\Component\Validator\Constraints as Assert;

class MailTypeExtension extends AbstractTypeExtension
{
    /**
     * @var EccubeConfig
     */
    protected $eccubeConfig;

    /**
     * CustomerType constructor.
     *
     * @param EccubeConfig $eccubeConfig
     */
    public function __construct(EccubeConfig $eccubeConfig)
    {
        $this->eccubeConfig = $eccubeConfig;
    }

    /**
     * {@inheritdoc}
     */
    public function getExtendedType()
    {
        return MailType::class;
    }

    /**
     * {@inheritdoc}
     */
    public static function getExtendedTypes(): iterable
    {
        yield MailType::class;
    }

    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            // メール from
            ->add('email_from', EmailType::class, [
                'required' => true,
                'constraints' => [
                    new Assert\NotBlank(),
                    new Email(null, null, $this->eccubeConfig['eccube_rfc_email_check'] ? 'strict' : null),
                    new Assert\Length([
                        'max' => $this->eccubeConfig['eccube_email_len'],
                    ]),
                ],
            ])
        ;
    }
}

で、FormTypeのクラスをテストする場合にはAbstractTypeTestCaseという専用のクラスが用意されている。
これを公式のテストクラスをサンプルに以下のようなテストクラスを作成したとする。

MailTypeExtensionTest.php
<?php

namespace Customize\Tests\Form\Extension;

use Eccube\Form\Type\Admin\MailType;
use Eccube\Tests\Form\Type\AbstractTypeTestCase;

class MailTypeExtensionTest extends AbstractTypeTestCase
{
    /** @var \Symfony\Component\Form\FormInterface */
    protected $form;

    protected function setUp(): void
    {
        parent::setUp();
        $this->form = $this->formFactory
            ->createBuilder(MailType::class, null, [
                'csrf_protection' => false,
            ])
            ->getForm();
    }
    
    ...
}

が、このままでは拡張した項目分は認識されない。
これを認識させるには以下のようにひと手間必要。

MailTypeExtensionTest.php
<?php

namespace Customize\Tests\Form\Extension;

use Customize\Form\Extension\MailTypeExtension;
use Eccube\Form\Type\Admin\MailType;
use Eccube\Tests\Form\Type\AbstractTypeTestCase;

class MailTypeExtensionTest extends AbstractTypeTestCase
{
    /** @var \Symfony\Component\Form\FormInterface */
    protected $form;

    protected function setUp(): void
    {
        parent::setUp();

        $builder = $this->formFactory
            ->createBuilder(MailType::class, null, [
                'csrf_protection' => false,
            ]);
        $extension = new MailTypeExtension();
        $extension->buildForm($builder, []); // ここ
        $this->form = $builder->getForm();
    }
    
    ...
}

一度ビルダー作ってからAbstractTypeExtensionを継承したクラスを通してからフォーム作ってあげれば認識できるようになる。


ネットに全然サンプル見つかんなかったけど、みんなテストしてないの...?

Discussion