2012-10-22 3 views
3

사용자 정의 폼 유형의 바인드 이벤트에서 메소드를 테스트하려고합니다. 여기 바인드 이벤트에 대한 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()) 
    ; 
} 

내 테스트 클래스는 심포니 \ 구성 요소 \ 양식 \ 테스트에서 상속 \ 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() thro getDataClass()에 예외가 있습니다.

질문은 바인딩 테스트를 수행하기 위해 양식을 올바르게 작성하는 방법입니까?

답변

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

내가 모의를 사용하지 않고 전체 양식을 다시 관리 할 수 ​​있다고 생각하지만, 그것은 불가능한 것 같다.

누군가가 더 나은 솔루션을 제공한다면 관심이 있습니다.