duan1983 2014-01-31 13:03
浏览 52
已采纳

Symfony2测试:使用html过滤:包含返回一个值

I want to test my Symfony2 application with PHPUnit when a user submits a form without any data.

My validations are activared, so error messages are displayed correctly in a navigator. For example in the entity :

class Foo
{

    /**
     * @var string
     *
     * @Assert\NotBlank()
     * @ORM\Column(name="name", type="string", length=255)
     */
    private $name;

    /**
     * @var string
     *
     * @Assert\NotBlank()
     * @ORM\Column(name="city", type="string", length=255)
     */
   private $city;

}

And the type of this entity :

class FooType extends AbstractType
{
    /**
     * @param FormBuilderInterface $builder
     * @param array $options
     */
    public function buildForm(FormBuilderInterface $builder, array $options)
    {
        $builder
            ->add('name', 'text')
            ->add('city', 'text');
    }

    // ...
}

When I submit the form without any data, the response contains 2 messages "This value should not be blank".

So in my tests I want to retrieve this 2 messages, but the filter function just returns 1 :

public function testShouldNotSaveANewFooWhenDataIsEmpty()
{
    $crawler = $this->client->request('GET', '/foo/new');
    $form = $crawler->selectButton('Add')->form(array(
        'foo[name]'  => '',
        'foo[city]'  => ''
    ));

    $crawler = $this->client->submit($form);
    echo $crawler->filter('html:contains("This value should not be blank")')->count(); // Should display 2, not 1
}

Have you got any idea please ?

  • 写回答

1条回答 默认 最新

  • duanhe8280 2014-01-31 17:25
    关注

    The selector html:contains("This value should not be blank") that you use means get every <html> tag containing the "This value should not be blank" string. Even if this string is present twice, there is only one <html> tag per page, so you will never count 2 filtered items.

    The solution is to use a more specific rule:

    $crawler->filter('div:contains("This value should not be blank")')
    

    Use the name of the tag which contains your error messages. By default it's <div> but you may have changed this in your Twig template.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论

报告相同问题?