Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/300.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 如何在Symfony中对表单中的重复密码进行单元测试?_Php_Forms_Unit Testing_Symfony - Fatal编程技术网

Php 如何在Symfony中对表单中的重复密码进行单元测试?

Php 如何在Symfony中对表单中的重复密码进行单元测试?,php,forms,unit-testing,symfony,Php,Forms,Unit Testing,Symfony,我正在尝试对Symfony应用程序中的表单进行单元测试。一个普通的表单可以很好地工作,但是当我有一个重复的表单类型时,我无法进行测试 测试: class MoniteurCreationTypeTest extends TypeTestCase { public function testSubmitValidData() { $formData = array( 'username' => 'user', '

我正在尝试对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类型都是word,但在这里,我从表单的单元测试中变成了null。你知道为什么吗

谢谢
最诚挚的问候

这里发生了一些事情

  • 您的
    $formData
    变量正在使用
    password
    键,而该键应为
    plainPassword
    ,这是您在MonitorCreationType中的字段名
  • 这可能不是测试对象中的值是否正确设置的正确位置-这似乎更适合于功能测试。表单单元测试只是测试表单的操作能力,而不是设置值
  • 该字段由另外两个字段组成,通常命名为
    first
    second
    。如果选择,您可以通过
    第一个\u名称
    第二个\u名称
    选项进行更改
如果您确实想向表单提交正确的数据,然后测试它是否已设置(如果您
dump($form->getData());
您将看到它),那么您需要按如下方式创建表单数据:

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

一个注意事项-您的表单中没有名为
password
的字段-您不应该对此进行检查,您应该检查
plainPassword
是的,我也尝试过,但出现了相同的错误谢谢您的回答,但我仍然收到错误:断言两个对象相等失败。--预期+++Actual@@@@@@username'=>'user'-'plainPassword'=>'user'+'plainPassword'=>null'password'=>null'email'=>null'isActive'=>null'derniereConnexion'=>null'DateRecreactionMotdePasse'=>null我认为您在测试错误的东西-您不会使用此单元测试来测试您的实体已使用传递到表单中的数据进行了更新(请参阅我的第二个要点)。这是为了对表单本身进行单元测试,而不是它如何与对象交互。阅读您的评论,我理解这一点。我认为我做了错误的测试,但我不知道如何做一个更好的测试?Symfony cookbook文章中的TestObject——我在任何地方都找不到,而这篇文章所基于的原始博文也没有提到它。如果需要,您可以简单地执行
$this->assertEquals($formData,$form->getData())这可能会测试您需要的所有内容。从那里,您可以完全摆脱
$object
设置和断言。