2015-04-20 45 views
0

我在單元測試方面幾乎沒有經驗。我閱讀這個symfony食譜章節來測試一個表單類型。收集表單的單元測試

http://symfony.com/doc/current/cookbook/form/unit_testing.html

我的形式是這樣的:

public function __construct(SecurityContext $securityContext, \Doctrine\ORM\EntityManager $em) 
{ 
    $this->securityContext = $securityContext; 
    $this->entityManager = $em; 
} 

    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder->add('title', 'text', array('label' => 'title', 'translation_domain' => 'messages', 'attr' => array('maxlength' => 255))) 
       ->add('comments', 'collection', array(
         'type'   => new CommentType() , 
         'allow_add' => false, 
         'allow_delete' => false, 
         'label'  => false, 
         'options'  => array(
          'label' => false, 
         ) 
        ) 
       ) 
       ->add('translations', 'a2lix_translations', array(
         'fields' => array(
          'coverLetter' => array(
           'label' => 'msg.coverLetter', 
           'field_type' => 'textarea', 
           'attr' => array('class' => 'rte') 
          ) 
         ) 
       )); 
    } 

現在我寫一個類來測試我的形式。

class QuestionnaireControllerTest extends TypeTestCase 
{ 



    public function testAddQuestionnaire() 
    { 

     $kernel = new \AppKernel('dev', true); 
     $kernel->boot(); 

     $container = $kernel->getContainer(); 

     $securityContext = $container->get('security.context'); 
     $entityManager = $container->get('doctrine.orm.entity_manager'); 


     $formData = array('title' => 'Exp. title'); 

     $type = new QuestionnaireType($securityContext, $entityManager); 
     $form = $this->factory->create($type); 



     $form->submit($formData); 

     $this->assertTrue($form->isSynchronized()); 


     $view = $form->createView(); 
     $children = $view->children; 

     foreach (array_keys($formData) as $key) { 
      $this->assertArrayHasKey($key, $children); 
     } 

    } 
} 

但我對我的測試類有一些問題。

  1. 這是獲取內核的正確方法嗎?
  2. 如何測試表單項目「評論(集合)」,「翻譯(a2lix_translations)」?

不幸的是我不會爲這些問題找到有用的教程。

回答

0

當談到TypeTest的時候,它可能會變得有點奇怪,因爲它似乎不在循環中。我遇到了一些類似的問題,實際上做了以下事情:

1)關於內核:擴展KernelTestCase並在測試中包含TypeTestCase(和超級)邏輯(或創建一個抽象)。這樣你會有一個更一致的內核初始化方式和TypeTestCase是不是那麼大,除了表單初始化。實際上可以自定義這可能會對以後有所幫助。

2)爲了得到特別是加載擴展的A2lix東西到你的考試形式,你必須覆蓋

protected function getExtensions() 

,並返回一個數組

return array(
     new PreloadedExtension(..., array()) 
); 

對於A2lix ......看起來像

$gedmoTranslationsType = new GedmoTranslationsType($this->container->get('a2lix_translation_form.gedmo.listener.translations'), $this->container->get('a2lix_translation_form.gedmo.service.translation'), $this->getLocales(), false); 
$gedmoTranslationsLocalesType = new GedmoTranslationsLocalesType(); 
$translationsFields = new TranslationsFieldsType(); 

return array(
    $gedmoTranslationsType->getName() => $gedmoTranslationsType, 
    $gedmoTranslationsLocalesType->getName() => $gedmoTranslationsLocalesType, 
    $translationsFields->getName() => $translationsFields, 
); 

我已經讓自己的容器和區域設置方便的成員和功能。你應該這樣做。

一般來說,擴展也將變得重要,例如,測試實體類型。因此,概括這些內容可能會有所幫助。

實際上有很多東西可以用來進行類型測試,你會發現一段時間以後。無論如何,我希望這有助於。

最好