Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/unit-testing/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/sql-server-2008/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Unit testing 使用自定义验证器进行symfony2单元测试验证_Unit Testing_Dependency Injection_Symfony_Phpunit - Fatal编程技术网

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

Unit testing 使用自定义验证器进行symfony2单元测试验证,unit-testing,dependency-injection,symfony,phpunit,Unit Testing,Dependency Injection,Symfony,Phpunit,我正在尝试为一个模型编写一个测试,该模型既有一些普通的验证器,也有一个使用实体管理器和请求的自定义验证器。如果出于某种原因,我会使用phpunit进行测试 我正在另一个测试中测试定制验证器,方法是将实体管理器和请求都存根,然后验证一些对象。因为这证明了自定义验证是有效的,所以我只需要测试正常的验证,如果这是可能的话,只需将自定义验证程序排除在外即可 这是我的模型: /** * @MyAssert\Client() */ abstract class BaseRequestModel {

我正在尝试为一个模型编写一个测试,该模型既有一些普通的验证器,也有一个使用实体管理器和请求的自定义验证器。如果出于某种原因,我会使用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定义的验证器,MyAssert\Client是一个服务,需要由依赖项注入容器解决


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

我会这样说:

class MyTest扩展了Symfony\Bundle\FrameworkBundle\Test\WebTestCase
{
私有函数getKernel()
{
$kernel=$this->createKernel();
$kernel->boot();
返回$kernel;
}
公共函数testCustomValidator()
{
$kernel=$this->getKernel();
$validator=$kernel->getContainer()->get('validator');
$violationList=$validator->validate(新请求模型);
$this->assertEquals(1,$violationList->count());
//或任何其他类似:
$this->assertEquals('client not valid',$violationList[0]->getMessage());
}
}
您试过这个吗

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

为什么不在功能测试中测试它呢?您已经在对自定义验证器类进行单元测试,所以现在需要在真实环境中进行测试。为什么不从真正的容器中获取验证器,比如在
Symfony\Bundle\FrameworkBundle\Test\WebTestCase
中创建的容器?首先,功能测试很慢。我必须设置测试数据库,用fixture填充它,然后运行测试。这是适用于那些只需要在一切就绪的情况下进行测试的东西,比如网页的使用情况。为了测试模型验证,我不需要数据库和所有东西,所以我只想单独测试它。我同意这很慢,但使用DIC延迟加载,您只需要实例化
验证程序
服务及其直接依赖项(如注释阅读器)。没有数据库,没有http调用,没有调用
$container->get('validator')->validate($object)的其他调用好的,我试过了。下一个问题:服务有作用域请求,因为验证程序出于验证的原因需要ip。我正在考虑将验证的定义从annotation更改为yml,然后使用另一个yml使用存根覆盖这个特殊的验证器$容器->设置('request',新请求,'request')现在它正在工作。通过使用一些存根覆盖自定义验证器的类,我可以很好地进行测试。谢谢