Zend framework2 带有自定义验证程序的PHPUnit ZF2 InputFilter
我有以下InputFilter:Zend framework2 带有自定义验证程序的PHPUnit ZF2 InputFilter,zend-framework2,phpunit,Zend Framework2,Phpunit,我有以下InputFilter: <?php namespace Login\InputFilter; use Zend\InputFilter\InputFilter; /** * Class Login * * @package Login\InputFilter */ class Login extends InputFilter { /** * Construct */ public function __construct()
<?php
namespace Login\InputFilter;
use Zend\InputFilter\InputFilter;
/**
* Class Login
*
* @package Login\InputFilter
*/
class Login extends InputFilter
{
/**
* Construct
*/
public function __construct()
{
/**
* Password
*/
$this->add(
[
'name' => 'password',
'required' => true,
'filters' => [
[
'name' => 'stringtrim'
]
],
'validators' => [
[
'name' => 'stringlength',
'options' => [
'min' => '5',
'max' => '128'
],
'break_chain_on_failure' => true
],
[
'name' => 'regex',
'options' => [
'pattern' => '/^[^\\\' ]+$/'
],
'break_chain_on_failure' => true
]
]
]
);
}
/**
* Init
*/
public function init()
{
/**
* Employee ID
*/
$this->add(
[
'name' => 'employeeId',
'required' => true,
'filters' => [
[
'name' => 'stringtrim'
]
],
'validators' => [
[
'name' => 'stringlength',
'options' => [
'min' => '1',
'max' => '20'
],
'break_chain_on_failure' => true
],
[
'name' => 'digits',
'break_chain_on_failure' => true
],
[
'name' => 'Login\Validator\EmployeeId',
'break_chain_on_failure' => true
]
]
]
);
}
}
测试运行时,会产生以下错误:
1) LoginTest\InputFilter\LoginTest::testFormHasElements
Argument 1 passed to Login\Validator\EmployeeId::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /vhosts/admin-application/vendor/zendframework/zendframework/library/Zend/ServiceManager/AbstractPluginManager.php on line 180 and defined
我不确定如何才能通过这个特定的错误。我想我需要用嘲弄,但我不确定
验证器有一个工厂,该工厂从服务定位器提供条令实体管理器
我对PHPUnit还是一个新手,但我一直在试着在这里提问之前做我的研究
有什么想法吗?您之所以会出现此错误,是因为您直接实例化了输入过滤器,而它当时并不知道您的自定义验证器工厂 在实际应用程序中,InputFilter用于从服务管理器获取验证器 我认为有两种方法可以解决这个问题: 1.)您可以从应用程序配置中设置real service manager,如中所述,然后从service manager中提取输入筛选器:
$inputFilter=Bootstrap::getServiceManager()->get(\Login\inputFilter\Login::class);//如果您有其他服务,请更改服务名称
如果您想编写某种集成测试,这个解决方案是很好的
2.)您可以模拟自定义验证器,并在安装方法中将其插入到ValidatorPluginManager
:
受保护的功能设置()
{
$validator=$this->getMockBuilder(\Login\validator\EmployeeId::class)->getMock();
$inputFilter=新登录名();
$inputFilter->getFactory()
->getDefaultValidatorChain()
->getPluginManager()
->setService(\Login\Validator\EmployeeId::class,$Validator);
$inputFilter->init();
$this->inputFilter=$inputFilter;
父::设置();
}
如果您想为登录输入筛选器编写单元测试,此解决方案很好。谢谢您的详细解释。你提到的很有道理,这使我回到了正轨。我添加到示例中的唯一一件事是$validator需要为模拟对象设置
->disableOriginalConstructor()
1) LoginTest\InputFilter\LoginTest::testFormHasElements
Argument 1 passed to Login\Validator\EmployeeId::__construct() must be an instance of Doctrine\ORM\EntityManager, none given, called in /vhosts/admin-application/vendor/zendframework/zendframework/library/Zend/ServiceManager/AbstractPluginManager.php on line 180 and defined