【问题标题】:Unit test - custom class validation with entity manager单元测试 - 使用实体管理器进行自定义类验证
【发布时间】:2013-07-24 13:39:09
【问题描述】:

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

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

我的验证器是一个类验证器,但在字段姓氏$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();

【问题讨论】:

  • 嗯。你的验证器是否被调用?我怀疑不是。我假设您将 User 映射到 validation.yml 中的验证器?如果是这样,那么您需要更多的东西来将验证器与配置文件联系起来。
  • 如何查看我的验证器是否被调用?是的,我的验证器映射在我的 validation.yml 中,当我在我的表单中使用它时工作正常

标签: validation testing symfony symfony-2.3


【解决方案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 是如何将所有东西连接起来的。

【讨论】:

  • 我可以访问 static::get('validator') 而不是我的 Validation::createValidatorBuilder()->getValidator();它工作正常!多谢。你能解释一下调用 static::get('validator') 而不是 $this->get('validator') 或 Validation::createValidatorBuilder()->getValidator();
猜你喜欢
  • 2015-01-23
  • 1970-01-01
  • 2017-02-18
  • 1970-01-01
  • 2021-06-24
  • 1970-01-01
  • 1970-01-01
  • 2017-02-16
  • 1970-01-01
相关资源
最近更新 更多