Zend framework2 带有自定义验证程序的PHPUnit ZF2 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()

我有以下InputFilter:

<?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