草庐IT

php - Symfony2 单元测试表单提交

coder 2024-05-03 原文

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

<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 - Symfony2 单元测试表单提交的更多相关文章

  1. ruby-on-rails - 使用 Ruby on Rails 进行自动化测试 - 最佳实践 - 2

    很好奇,就使用ruby​​onrails自动化单元测试而言,你们正在做什么?您是否创建了一个脚本来在cron中运行rake作业并将结果邮寄给您?git中的预提交Hook?只是手动调用?我完全理解测试,但想知道在错误发生之前捕获错误的最佳实践是什么。让我们理所当然地认为测试本身是完美无缺的,并且可以正常工作。下一步是什么以确保他们在正确的时间将可能有害的结果传达给您? 最佳答案 不确定您到底想听什么,但是有几个级别的自动代码库控制:在处理某项功能时,您可以使用类似autotest的内容获得关于哪些有效,哪些无效的即时反馈。要确保您的提

  2. ruby-on-rails - Rails 编辑表单不显示嵌套项 - 2

    我得到了一个包含嵌套链接的表单。编辑时链接字段为空的问题。这是我的表格:Editingkategori{:action=>'update',:id=>@konkurrancer.id})do|f|%>'Trackingurl',:style=>'width:500;'%>'Editkonkurrence'%>|我的konkurrencer模型:has_one:link我的链接模型:classLink我的konkurrancer编辑操作:defedit@konkurrancer=Konkurrancer.find(params[:id])@konkurrancer.link_attrib

  3. ruby - 使用 C 扩展开发 ruby​​gem 时,如何使用 Rspec 在本地进行测试? - 2

    我正在编写一个包含C扩展的gem。通常当我写一个gem时,我会遵循TDD的过程,我会写一个失败的规范,然后处理代码直到它通过,等等......在“ext/mygem/mygem.c”中我的C扩展和在gemspec的“扩展”中配置的有效extconf.rb,如何运行我的规范并仍然加载我的C扩展?当我更改C代码时,我需要采取哪些步骤来重新编译代码?这可能是个愚蠢的问题,但是从我的gem的开发源代码树中输入“bundleinstall”不会构建任何native扩展。当我手动运行rubyext/mygem/extconf.rb时,我确实得到了一个Makefile(在整个项目的根目录中),然后当

  4. ruby - Ruby 的 Hash 在比较键时使用哪种相等性测试? - 2

    我有一个围绕一些对象的包装类,我想将这些对象用作散列中的键。包装对象和解包装对象应映射到相同的键。一个简单的例子是这样的:classAattr_reader:xdefinitialize(inner)@inner=innerenddefx;@inner.x;enddef==(other)@inner.x==other.xendenda=A.new(o)#oisjustanyobjectthatallowso.xb=A.new(o)h={a=>5}ph[a]#5ph[b]#nil,shouldbe5ph[o]#nil,shouldbe5我试过==、===、eq?并散列所有无济于事。

  5. ruby - RSpec - 使用测试替身作为 block 参数 - 2

    我有一些Ruby代码,如下所示:Something.createdo|x|x.foo=barend我想编写一个测试,它使用double代替block参数x,这样我就可以调用:x_double.should_receive(:foo).with("whatever").这可能吗? 最佳答案 specify'something'dox=doublex.should_receive(:foo=).with("whatever")Something.should_receive(:create).and_yield(x)#callthere

  6. ruby - Sinatra:运行 rspec 测试时记录噪音 - 2

    Sinatra新手;我正在运行一些rspec测试,但在日志中收到了一堆不需要的噪音。如何消除日志中过多的噪音?我仔细检查了环境是否设置为:test,这意味着记录器级别应设置为WARN而不是DEBUG。spec_helper:require"./app"require"sinatra"require"rspec"require"rack/test"require"database_cleaner"require"factory_girl"set:environment,:testFactoryGirl.definition_file_paths=%w{./factories./test/

  7. ruby-on-rails - 迷你测试错误 : "NameError: uninitialized constant" - 2

    我遵循MichaelHartl的“RubyonRails教程:学习Web开发”,并创建了检查用户名和电子邮件长度有效性的测试(名称最多50个字符,电子邮件最多255个字符)。test/helpers/application_helper_test.rb的内容是:require'test_helper'classApplicationHelperTest在运行bundleexecraketest时,所有测试都通过了,但我看到以下消息在最后被标记为错误:ERROR["test_full_title_helper",ApplicationHelperTest,1.820016791]test

  8. ruby - 如何在 Rails 4 中使用表单对象之前的验证回调? - 2

    我有一个服务模型/表及其注册表。在表单中,我几乎拥有服务的所有字段,但我想在验证服务对象之前自动设置其中一些值。示例:--服务Controller#创建Action:defcreate@service=Service.new@service_form=ServiceFormObject.new(@service)@service_form.validate(params[:service_form_object])and@service_form.saverespond_with(@service_form,location:admin_services_path)end在验证@ser

  9. ruby - 即使失败也继续进行多主机测试 - 2

    我已经构建了一些serverspec代码来在多个主机上运行一组测试。问题是当任何测试失败时,测试会在当前主机停止。即使测试失败,我也希望它继续在所有主机上运行。Rakefile:namespace:specdotask:all=>hosts.map{|h|'spec:'+h.split('.')[0]}hosts.eachdo|host|begindesc"Runserverspecto#{host}"RSpec::Core::RakeTask.new(host)do|t|ENV['TARGET_HOST']=hostt.pattern="spec/cfengine3/*_spec.r

  10. ruby-on-rails - 如何使辅助方法在 Rails 集成测试中可用? - 2

    我在app/helpers/sessions_helper.rb中有一个帮助程序文件,其中包含一个方法my_preference,它返回当前登录用户的首选项。我想在集成测试中访问该方法。例如,这样我就可以在测试中使用getuser_path(my_preference)。在其他帖子中,我读到这可以通过在测试文件中包含requiresessions_helper来实现,但我仍然收到错误NameError:undefinedlocalvariableormethod'my_preference'.我做错了什么?require'test_helper'require'sessions_hel

随机推荐