Php 如何在ZF2中测试一个自定义的或多个自定义的程序?

Php 如何在ZF2中测试一个自定义的或多个自定义的程序?,php,doctrine-orm,zend-framework2,doctrine,phpunit,Php,Doctrine Orm,Zend Framework2,Doctrine,Phpunit,为了向DoctrineModule\Stdlib\Hydrator\DoctrineObject添加一些额外的(过滤)功能,我扩展了它并创建了类EntityHydrator: namespace MyLib\Model\Entity\Hydrator; class EntityHydrator extends \DoctrineModule\Stdlib\Hydrator\DoctrineObject { protected $foo; protected $bar;

为了向
DoctrineModule\Stdlib\Hydrator\DoctrineObject
添加一些额外的(过滤)功能,我扩展了它并创建了类
EntityHydrator

namespace MyLib\Model\Entity\Hydrator;

class EntityHydrator extends \DoctrineModule\Stdlib\Hydrator\DoctrineObject
{
    protected $foo;
    protected $bar;

    public function __construct(
        \Doctrine\Common\Persistence\ObjectManager $objectManager,
        $byValue = true,
        $foo = true
    ) {
        parent::__construct($objectManager, $byValue);
        $this->setFoo($foo);
    }

    public function extract($object)
    {
        $extractedArray = parent::extract($object);
        $extractedArray = $this->getFoo()
            ? $this->performAdditionalFunctionality($extractedArray)
            : $extractedArray
        ;
        return $extractedArray;
    }

    // access methods for $foo and $bar

    // private/protected methods like performAdditionalFunctionality(...) and other
}
现在该类应该进行单元测试。问题是测试
提取(…)
。此方法基于
\DoctrineModule\Stdlib\Hydrator\DoctrineObject\extract(…)
。这意味着我需要一个
实体或
/
DoctrineObject
——及其所有依赖项。处理此问题并测试自定义(条令)水合器或装置的最佳方法是什么?

在这种情况下,您应该使用:

名称空间MyLib\Model\Entity\Hydrator;
使用Zend\Stdlib\Hydrator\HydratorInterface;
类EntityHydrator实现HydratorInterface
{
受保护$foo;
受保护的$bar;
受保护的$doctrineobjector;
公共函数构造(HydratorInterface$doctrineObjectHydrator,$foo=true)
{
$this->doctrineObjectHydrator=$doctrineObjectHydrator;
$this->setFoo($foo);
}
公共函数提取($object)
{
$extractedArray=$this->doctrineObject->extract($object);
$extractedArray=$this->getFoo()
?$this->执行附加功能($extractedArray)
:$extractedArray
;
返回$extractedArray;
}
//$foo和$bar的访问方法
//私有/受保护的方法,如PerformAdditionalFunction(…)和其他
}

现在,您可以轻松地模拟原始DoctrineObject hydrator,并在新hydrator中仅测试逻辑

为什么要测试DoctrineObject,你的目标应该是单独测试你的功能,对吗?对,但例如我的
EntityHydrator#extract(…)
是我的功能(它使用
parent::extract(…)
并在它执行一些特定的SUTF之后),应该对它进行测试。再一次:问题是,我的
实体对象是一个
/extends
DoctrineObject
。这意味着:如果我想测试它,我必须创建一个and
EntityHydrotor
——并且创建一个
EntityHydrotor
需要
DoctrineObject
的所有依赖项,并且需要付出很大的努力。