带集合的Symfony表格单元测试

时间:2017-06-26 13:56:34

标签: php forms symfony unit-testing phpunit

我正在尝试使用Symfony3 / PHPunit进行第一次单元测试和功能测试,但我找不到解决问题的方法。

简单来说,我正在尝试单独测试为管理UsersGroups而创建的表单(由FOSUserBundle提供)

我按照steps of the Symfony documentation来测试我的表单,我已经解决了一些与getExtensions()等有关的问题...以便能够毫无错误地运行我的测试

这是我的UserType.php

<?php

...

class UserType extends BaseCrudForm
{
    /**
     * {@inheritdoc}
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        parent::buildForm($builder, $options);

        $builder
            ->add('username', null, array('label' => 'label.username'))
            ->add('email', EmailType::class, array(
                'label' => 'label.email',
                'constraints' => array(
                    new Email()
                )
            ))
            ->add('enabled', CheckboxType::class, array('label' => 'label.enabled', 'required' => false))
            ->add('groups', EntityType::class, array(
                'class' => 'Acme\AdminBundle\Entity\Group',
                'multiple' => true,
                'required' => false,
            ))
            ->add('avatarImageFile', FileType::class, array('label' => 'label.avatar', 'required' => false))
        ;
    }

    ...

}

和我的UserTypeTest.php(我把测试留在了它里面):

<?php

...

class UserTypeTest extends BaseTypeTestCase
{
    public function testSubmitValidData()
    {
        $formData = array(
            'username' => 'nathalie_' . time(),
            'email' => 'nathalie_' . time() . '@portman.fr',
            'enabled' => true,
            'plainPassword' => 'pa$$word',

            ///// SOLUTION 1
            'groups' => array(
                $this->em->getRepository('AcmeAdminBundle:Group')->find(1)
            ),
            ///// SOLUTION 2
            'groups' => array(1),
        );

        $form = $this->factory->create(UserType::class);

        $user = User::fromArray($formData);

        $form->submit($formData);

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

        // dump($user, $form->getData());

        $this->assertEquals($user, $form->getData()); //Fails

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

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

问题:

断言$this->assertEquals($user, $form->getData());失败,因为集合User::groups不相等

解决方案1无效(参见上面的代码)

$user的集合没问题,但表单数据为空

解决方案2也不起作用(参见上面的代码)

表单数据没问题,但$user集合用简单的array(1)实例化(看到逻辑)

问题

如何使用相同的信息同时正确地设置我的对象User和我的表单(如本主题顶部链接的Symfony文档中所描述的那样)?

注意:正如我所说我是单位测试的新手,所以如果我错过了这一点,请不要犹豫告诉我

修改

以下是fromArray函数,在用户实体中实现为Trait

<?php

namespace Acme\AdminBundle\Traits;    

use Doctrine\Common\Util\Inflector;

trait FromArrayTrait
{
    /**
     * @param array $data
     * @return self
     */
    public static function fromArray(array $data)
    {
        $object = new self;

        foreach ($data as $key => $value) {
            $method = 'set' . Inflector::classify($key);

            if (method_exists($object, $method)) {
                call_user_func(array($object, $method), $value);
            }
        }

        return $object;
    }
}

0 个答案:

没有答案