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 ?
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.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With