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

Sgo*_*kes 6 phpunit unit-testing dependency-injection symfony

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

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

这是我的模型:

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

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

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

    // ...

}
Run Code Online (Sandbox Code Playgroud)

在我的测试中,我得到验证器,创建一个对象,然后验证它.

$validator = ValidatorFactory::buildDefault()->getValidator();
$requestModel = new RequestModel();
$errors = $validator->validate($requestModel);
Run Code Online (Sandbox Code Playgroud)

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

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

Flo*_*ian 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());
    }
}
Run Code Online (Sandbox Code Playgroud)

  • 您可以使用`$ container-> enterScope('request')手动更改容器的范围; $ container-> set('request',new Request,'request');` (2认同)