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之后),应该对它进行测试。再一次:问题是,我的实体对象是一个/extendsDoctrineObject
。这意味着:如果我想测试它,我必须创建一个andEntityHydrotor
——并且创建一个EntityHydrotor
需要DoctrineObject
的所有依赖项,并且需要付出很大的努力。