使用自定义验证器进行symfony2单元测试验证

时间:2012-02-09 10:39:23

标签: unit-testing dependency-injection symfony phpunit

我正在尝试使用实体管理器和请求为包含一些普通验证器和自定义验证器的模型编写测试。如果由于某种原因这很重要,我正在使用phpunit进行测试。

我通过对实体管理器和请求进行存根,然后验证某些对象来测试另一个测试中的自定义验证器。由于这证明自定义验证有效,我只需要测试正常验证,如果可以,只需将自定义验证器保留下来。

这是我的模特:

/**
 * @MyAssert\Client()
 */
abstract class BaseRequestModel {

    /**
     * @Assert\NotBlank(message="2101")
     */
    protected $clientId;

    /**
     * @Assert\NotBlank(message="2101")
     */
    protected $apiKey;

    // ...

}

在我的测试中,我正在获取验证器,创建一个对象然后验证它。

$validator = ValidatorFactory::buildDefault()->getValidator();
$requestModel = new RequestModel();
$errors = $validator->validate($requestModel);

当然这会失败,因为它找不到为MyAssert \ Client定义的Validator,这是一个服务,需要通过某个依赖注入容器来解析。

任何人都知道如何存根自定义验证器或将其从验证中排除?

2 个答案:

答案 0 :(得分:6)

我会选择类似的东西:

class MyTest extends Symfony\Bundle\FrameworkBundle\Test\WebTestCase
{
    private function getKernel()
    {
        $kernel = $this->createKernel();
        $kernel->boot();

        return $kernel;
    }

    public function testCustomValidator()
    {
        $kernel = $this->getKernel();
        $validator = $kernel->getContainer()->get('validator');

        $violationList = $validator->validate(new RequestModel);

        $this->assertEquals(1, $violationList->count());
        // or any other like:
        $this->assertEquals('client not valid', $violationList[0]->getMessage());
    }
}

答案 1 :(得分:3)

你试过这个吗?

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