2016-01-06 55 views
1

我想在我的Symfony應用程序中單元測試一個表單。一個正常的表單可以正常工作,但我無法測試何時有重複的表單類型。如何在Symfony中的單元測試重複密碼?

測試:

class MoniteurCreationTypeTest extends TypeTestCase 
{ 
    public function testSubmitValidData() 
    { 
     $formData = array(
      'username' => 'user', 
      'plainPassword' => 'pass', 
     ); 

     $type = new \AppBundle\Form\MoniteurCreationType(); 
     $form = $this->factory->create($type); 
     $object = new Moniteur(); 

     $object->setUsername($formData['username']); 
     $object->setPlainPassword($formData['password']); 

     $form->submit($formData); 

     $this->assertTrue($form->isSynchronized()); 
     $this->assertEquals($object, $form->getData()); 

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

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

我的表單類型:

class MoniteurCreationType extends AbstractType 
{ 
    public function buildForm(FormBuilderInterface $builder, array $options) 
    { 
     $builder 
      ->add('username', 'text', array('label' => 'Nom d\'utilisateur', 'attr' => array('placeholder' => 'Insérez ici votre nom d\'utilisateur'))) 
      ->add('plainPassword', 'repeated', array(
       'type' => 'password', 
       'first_options' => array('label' => 'Mot de passe', 'attr' => array('placeholder' => 'Choisissez un mot de passe')), 
       'second_options' => array('label' => 'Répéter le mot de passe', 'attr' => array('placeholder' => 'Veuillez entrer encore une fois le mot de passe choisit')), 
        ) 
      ) 
      ->add('envoyer', 'submit', array('attr' => array('class' => 'col-lg-12 col-xs-12 btn btn-primary submit'))) 
     ; 
    } 

    public function configureOptions(OptionsResolver $resolver) 
    { 
     $resolver->setDefaults(array(
      'data_class' => 'AppBundle\Entity\Moniteur' 
     )); 
    } 

    public function getName() 
    { 
     return 'moniteurCreation'; 
    } 
} 

PHPUnit的日誌:

There was 1 failure: 

1) Tests\AppBundle\Form\MoniteurCreationTypeTest::testSubmitValidData 
Failed asserting that two objects are equal. 
--- Expected 
+++ Actual 
@@ @@ 
    'plainPassword' => null 
- 'password' => 'pass' 
+ 'password' => null 
    'email' => null 
    'isActive' => null 
    'derniereConnexion' => null 
    'dateRecuperationMotDePasse' => null 
) 

C:\web\www\testDoctrine\src\AppBundle\Tests\Form\MoniteurCreationTypeTest.php:29 

FAILURES! 
Tests: 8, Assertions: 60, Failures: 1. 

所有其他formy類型的詞,但在這裏,我成了一個空我的單元測試從表單中。你知道爲什麼嗎?

感謝 問候

+0

一個音符 - 你沒有一個叫'password'在你的表單字段 - 你不應該覈對的是,你應該檢查對'plainPassword' –

+0

是的,我也試過,但是出現相同的錯誤 – anubis

回答

1

有幾件事情怎麼回事。

  • $formData變量使用password一個鍵時,鑰匙應該是plainPassword,這是你的字段名MoniteurCreationType
  • 這可能不是來測試你的對象值是正確的地方正確設置 - 這似乎更適合功能測試。表格單元測試僅用於測試表格的操作能力,而不是設定值
  • RepeatedType由兩個其他字段組成,通常名稱爲firstsecond。如果您願意,可以通過first_namesecond_name選項更改這些選項。

如果你真的想正確的數據提交到您的表單,然後進行測試,它已經被設置(如果你dump($form->getData());你會看到它),那麼你就需要按照以下步驟創建表單數據:

$formData = array(
    'username' => 'user', 
    'plainPasword' => array('first' => 'pass', 'second' => 'pass), 
); 
+0

感謝您的回答,但我仍然收到錯誤: 失敗斷言兩個對象相同。 ---預期 +++實際 @@ @@ '用戶名'=> '用戶' - 'plainPassword'=> '用戶' + 'plainPassword'=>空 '密碼'=>空 'email'=> null 'isActive'=> null 'derniereConnexion'=> null 'dateRecuperationMotDePasse'=> null – anubis

+0

我認爲你正在測試錯誤的東西 - 你不會使用這個單元測試來測試你的實體更新了傳遞到表單中的數據(請參閱我的第二個項目符號點)。這是爲了單元測試表單本身,而不是它如何與你的對象進行交互。 –

+0

閱讀您的評論,我明白這一點。我認爲我做錯了測試,但我不知道如何做更好的測試? – anubis