3

カスタムフォームタイプのバインドイベントでメソッドをテストしようとしています。

これがコードです

public function bind(DataEvent $event)
{
    $form = $event->getForm();

    if($form->getNormData() instanceof BaseFileInterface && !$event->getData() instanceof UploadedFile) {
        $event->setData($form->getNormData());
    }

    if($event->getData() instanceof UploadedFile) {
        $hander = $this->handlerManager->getHandler(
            $form->getParent()->getConfig()->getDataClass(), 
            $form->getName()
        );

        $datas = $hander->createBaseFile($event->getData());
        $event->setData($datas);
    }

    if(is_string($event->getData())) {
        $event->setData(null);
    }
}

およびタイプのフォームビルダー:

public function buildForm(FormBuilderInterface $builder, array $options)
{
    $builder
        ->addEventSubscriber(new BaseFileListener($this->handlerManager))
        ->addViewTransformer(new BaseFileToStringTransformer())
    ;
}

私のテストクラスはSymfony\Component \ Form \ Tests \ FormIntegrationTestCaseを継承し、これを行っています:

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

    $this->handlerManager = $this->getHandlerManagerMock();

    $this->dispatcher = $this->getMock('Symfony\Component\EventDispatcher\EventDispatcherInterface');
    $this->builder = new FormBuilder(null, null, $this->dispatcher, $this->factory);

    $this->form =  $this->factory->create('my_file');
    $this->form->setParent($this->getFormMock())->setData(new DummyEntity());
}

protected function getFormMock()
{

    $mock = $this
        ->getMockBuilder('Symfony\Component\Form\Tests\FormInterface')
        ->disableOriginalConstructor()
        ->getMock()
    ;

    return $mock;
}

public function testBindHandleNewFileWithNonEmptyField()
{
    $data = $file = new UploadedFile(
        __DIR__.'/../Fixtures/test.gif',
        'original.gif',
        'image/gif',
        filesize(__DIR__.'/../Fixtures/test.gif'),
        null
    );

    $event = new FormEvent($this->form, $data);

    $listener = new BaseFileListener($this->handlerManager);
    $listener->bind($event);

    $this->assertInstanceOf('My\FooBundle\Entity\BaseFileInterface', $event->getData());
    $this->assertNotEquals($event->getData(), $this->form->getNormData());
}

問題は、$ form-> getParent()-> getConfig()-> getDataClass()がgetDataClass()で例外をスローすることです。

問題は、バインドテストを実行するためにフォームを正しく作成する方法です。

4

1 に答える 1