php - Symfony2 单元测试表单提交

标签 php forms unit-testing symfony

我有一个表单,当它呈现时看起来像这样:

<form name="service_user_registration" method="post" action="" novalidate="novalidate">

        <div>
             <label for="service_user_registration_user_email" class="required">E-mail</label>
             <input type="email" id="service_user_registration_user_email" name="service_user_registration[user][email]" required="required" size="30" class="sample_class" title="Sample title" placeholder="Your e-mail..." />
        </div>

        <div>
             <label for="service_user_registration_account_name" class="required">Company name</label>
             <input type="text" id="service_user_registration_account_name" name="service_user_registration[account][name]" required="required" placeholder="Your company name..." />
        </div>

        <button type="submit" id="service_user_registration_register" name="service_user_registration[register]" class="btn btn-primary">Register</button>

    <input type="hidden" id="service_user_registration__token" name="service_user_registration[_token]" value="VzkWJQw-2p-1lfBJoT5xwNB4dR2reT47i0ZTZES9LqY" />
</form>

我想对表单提交进行单元测试,如果我输入的数据写在底层对象中,它是一个注册对象。我像下面那样做,但我不知道如何正确设置 $data 数组,因为字段的名称属性看起来像一个数组。

class RegistrationTypeTest extends TypeTestCase
{
    public function testSubmit()
    {
        $user = new User();
        $account = new Account();
        $registration = new Registration($user,$account);

        $form = $this->factory->create(new RegistrationType(), $registration);

        $data = array(
            'service_user_registration[user][email]' => 'testing@test.com',
            'service_user_registration[account][name]' => 'New company'
        );

        $form->submit($data);

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

        $formData = $form->getData();

        $this->assertInstanceOf('Service\Bundle\UserBundle\Entity\Registration', $formData);

        $this->assertEquals($data['service_user_registration[user][email]'],   $formData->getUser()->getEmail());
        $this->assertEquals($data['service_user_registration[account][name]'], $formData->getAccount()->getName());
    }
}

最后两个断言失败,因为 Registration 对象中的 $formData 的所有内容均为空,当提交的字段均为空白时应该是这种情况。我也将 $data 写成了一个数组数组,但没有改变任何东西。

编辑(添加表单类型):

class RegistrationType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('user', new RegistrationUserType())
                ->add('account', new RegistrationAccountType())
                ->add('register', 'submit');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        # Using cascade validation because Valid constraint can not have validation groups

        $resolver->setDefaults([
            'cascade_validation' => true,
            'intention' => $this->getName()
        ]);
    }

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

class RegistrationUserType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('email', 'email');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => array('registration'),
            'data_class' => 'Service\Bundle\UserBundle\Entity\User',
            'intention' => $this->getName()
        ));
    }

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

class RegistrationAccountType extends AbstractType
{
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder->add('name', 'text');
    }

    public function setDefaultOptions(OptionsResolverInterface $resolver)
    {
        $resolver->setDefaults(array(
            'validation_groups' => array('registration'),
            'data_class' => 'Service\Bundle\UserBundle\Entity\Account',
            'intention' => $this->getName()
        ));
    }

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

最佳答案

然后人们继续提示 TDD 很愚蠢,很难,很糟糕,最后,it's dead ...

帮自己一个忙,停止尝试单元测试你不应该首先进行单元测试的东西。编写一些更高级别的测试。您至少有两个选择。

首先,您可以编写特定于该表单的集成测试,以在更广泛的上下文中测试其行为。例如,您可以创建一个表单实例,将数据传递给它,然后测试您从表单中获得的模型是否包含您传递的数据。

其次,您可以编写涉及此表单的端到端测试。如果表单不能正常工作,测试将失败。

由于端到端测试通常较慢,您实际上可以编写其中的一两个来测试您的代码在表单有效和无效时的行为是否正确。例如,当表单有效时,模型将被持久化并将用户重定向到某个地方。如果不是,则不会保留任何内容,并且会再次显示包含先前输入的数据和验证消息的表单。

然后您可以编写几个特定于表单的集成测试来测试其他一些数据输入组合,以确保它在这些情况下的行为正确。

实际上,如果您要测试验证,则可以省略表单本身的集成测试,并编写测试以直接在模型上测试验证规则。但是您仍然需要端到端测试来测试应用的整体流程。

关于php - Symfony2 单元测试表单提交,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23580332/

相关文章:

php - 如何在CentOS(php-fpm)中生成coredump

javascript - 两个具有相同操作的提交按钮,其中一个为同一表单添加了功能/操作

java - 更多 Mockito RETURNS_DEEP_STUBS 问题

php - 获取数据以便在表单上进行编辑

php - 在带有 Doctrine2 的 Symfony2 上,Object = Entity 吗?

ruby-on-rails - 带有连接表和 rails 的复选框

java - 出于测试目的终止 Java 线程

java - 不明白调用方法时模拟类是如何工作的

PHP - 增加一个值

php - form action 和 post 方法如何一起工作?