Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Symfony2 tests : filter with html:contains return one value

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 ?

like image 328
ncrocfer Avatar asked Jan 31 '14 13:01

ncrocfer


1 Answers

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.

like image 108
A.L Avatar answered Sep 18 '22 18:09

A.L