1

我正在尝试测试使用实体管理器的自定义验证器。

验证器在表单中工作正常,但我仍然在测试它时遇到问题:它永远不会引发冲突

我的验证器是类验证器,但向字段姓氏添加了违规$this->context->addViolationAt('lastname',$message,$param);

我的测试类中有代码:

public function testNoMoreThreeBatman() {

  $validator = Validation::createValidatorBuilder()->getValidator();
 
  //I have already checked I got my test database ok, full with what I want
  
  //I create a new one with the name 'wayne' (so it'll be not valid)
  $user = new User();
  $user->setLastname('wayne');

  $violationList = $validator->validate($user);

  $this->assertEquals(1, $violationList->count());

}

我找到了很多主题,但没有人给我提示。我用另一个自定义验证进行了测试,一个简单的验证,我没有问题。我想知道问题是否可能来自它是一个类验证器的事实,或者它将违规添加到一个字段的事实

因为我的答案在评论中,所以我在这里发布回复以获得更多可见性:

正确的是 Validation::createValidatorBuilder()->getValidator();

代替 $validator = Validation::createValidatorBuilder()->getValidator();

4

1 回答 1

1

因此,虽然它确实是一个功能测试,但我认为你最好的办法是获取验证器服务:

class MyTest extends Symfony\Bundle\FrameworkBundle\Test\WebTestCase
{
    public function test()
    {
        $client = static::createClient();
        $validator = $client->getContainer()->get('validator');

        ...

==================================================== ===========

你能解释一下调用 static::get('validator') 和 Validation::createValidatorBuilder 之间的区别吗?

在回答您的评论时,我不知道您所指的 static:get 来自哪里。您使用什么基类进行单元测试?但这并不重要,因为我假设 static::get 正在访问依赖注入容器。

所以你的问题真的是:使用 Symfony 2 容器和实际组件本身有什么区别?

要理解的是,当您启动 Symfony 2 应用程序时,会读取各种配置文件,并且会在幕后发生各种事情。特别是,一个名为验证器的服务是由诸如validation.yml之类的东西创建和初始化的。同样,您的自定义验证器已创建并作为依赖项传递给您的实体管理器。

当您单独使用 Validation::createValidatorBuilder 时,这些都不会发生。没有配置,没有映射,没有实体管理器等。看看代码,看看实际发生了什么。查看组件文档以了解如何直接使用它。这实际上是一个值得练习的练习,因为它有助于理解 Symfony 是如何将所有东西连接起来的。

于 2013-07-24T15:29:46.693 回答