Symfony2 tests : filter with html:contains return one value

netbeans, php, symfony, tdd

Solution

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.

Problem

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 ?

Original source