2016-01-06 54 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