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

时间:2014-01-31 13:03:37

标签: php symfony netbeans tdd

当用户提交没有任何数据的表单时,我想用PHPUnit测试我的Symfony2应用程序。

我的验证已激活,因此错误消息会在导航器中正确显示。例如,在实体中:

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;

}

这个实体的类型:

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

    // ...
}

当我提交没有任何数据的表单时,响应中包含2条消息“此值不应为空白”。

所以在我的测试中我想要检索这两条消息,但过滤器函数只返回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
}

你有什么想法吗?

1 个答案:

答案 0 :(得分:6)

您使用的选择器html:contains("This value should not be blank")表示获取包含<html>字符串的每个"This value should not be blank"标记。即使此字符串存在两次,每页只有一个<html>标记,因此您永远不会计算2个已过滤的项目。

解决方案是使用更具体的规则:

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

使用包含错误消息的标记名称。默认情况下它是<div>,但您可能已在Twig模板中更改了此内容。