ZF2 / PHPUnit:模拟Zend / Db /适配器/适配器以供进一步使用

时间:2015-12-11 13:48:52

标签: unit-testing zend-framework zend-framework2 phpunit zend-db

目标:在Zend Framework 2中对InputFilter进行单元测试。

问题:需要一个模拟的DbAdapter。

由于我对单元测试比较陌生,所以我刚开始使用模拟类。经过大量的研究后,我仍然无法找到适合我的问题的解决方案,所以在这里我们使用我的过滤器来启动:

class ExampleFilter extends Inputfilter
{
    protected $dbAdapter;

    public function __construct(AdapterInterface $dbAdapter)
    {
        $this->dbAdapter = $dbAdapter;
    }

    public function init()
    {
        $this->add(
            [
                'name' => 'example_field',
                'required' => true,
                'filters' => [
                    ['name' => 'StringTrim'],
                    ['name' => 'StripTags'],
                ],
                'validators' => [
                    [
                        'name'    => 'Db\NoRecordExists',
                        'options' => [
                            'adapter' => $this->dbAdapter,
                            'table' => 'example_table',
                            'field' => 'example_field',
                        ],
                    ],
                ],
            ]
        );
    }
}

无需适配器,测试此过滤器相当容易。我的问题是在我的TestClass中创建Filter,如下所示:

class ExampleFilterTest extends \PHPUnit_Framework_TestCase
{
    protected $exampleFilter;
    protected $mockDbAdapter;

    public function setUp()
    {
        $this->mockDbAdapter = $this->getMockBuilder('Zend\Db\Adapter')
            ->disableOriginalConstructor()
            ->getMock();
        $this->exampleFilter = new ExampleFilter($this->mockDbAdapter);
    }

}

当像这样创建过滤器时,ExampleFilter类最终会说我确实为其构造函数提供了一个错误的类。在期待Zend \ Db \ Adapter \ Adapter类型之一时,它正在接收模拟对象。

我当然可以创建一个真正的适配器,但我想避免对数据库执行实际查询,因为它是一个单元测试,这将远远超出我的单元边界进行测试。

有谁能告诉我如何实现我用模拟DbAdapter测试过滤器的目标?

1 个答案:

答案 0 :(得分:1)

嗯......当我评论gontrollez提示时,我已经闻到了我的错误。我不得不创建一个'Zend / Db / Adapter / AdapterInterface'的模拟,而不仅仅是'/ Zend / Db / Adapter'。

感谢你带我走正确的道路gontrollez:)