🍨
ec-cube4でFormTypeをカスタマイズしたときのテストクラス
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