Symfony 2.1对绑定事件进行单元测试

时间:2012-10-22 20:48:39

标签: symfony phpunit symfony-forms symfony-2.1

我正在尝试测试自定义表单类型的绑定事件的方法。

这是代码

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()上抛出异常。

问题是如何正确构建表单以执行绑定测试?

1 个答案:

答案 0 :(得分:3)

好的,回答我自己:)

这是phpunit中的好模拟:

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());
}

protected function getFormMock()
{
    $mock = $this->getMock('Symfony\Component\Form\Tests\FormInterface');

    $mock
        ->expects($this->any())
        ->method('getConfig')
        ->will($this->returnValue($this->getFormConfigMock()))
    ;

    return $mock;
}

protected function getFormConfigMock()
{
    $mock = $this->getMockBuilder('Symfony\Component\Form\FormConfigInterface')
        ->disableOriginalConstructor()
        ->getMock();

    $mock
        ->expects($this->any())
        ->method('getDataClass')
        ->will($this->returnValue('My\FooBundle\Tests\DummyEntity'))
    ;

    return $mock;
}

我以为我可以设法重建整个表单而不使用mock,但似乎不可能。

如果某人有更好的解决方案,我很感兴趣。

相关问题