9

Zend的好人和一些博主正在推荐ZF2的新服务定位器/管理器,而不是其内置的依赖注入系统。ZF2服务定位器和依赖注入

我的问题是,是否可以/方便地将模拟对象注入到服务中?我在PHPUnit模块引导中看到了一些稍微笨拙的尝试;但是有没有一种方法可以像ZF1 + Yadif一样使用这种干净便捷的服务系统?

回答

12

是的,您可以将模拟对象注入到服务中。对于单元测试,服务定位器甚至不发挥作用:

$service = new MyService($mockDependency); 

如果你正在写,你需要使用服务定位与依赖和嘲笑,你可以的图形配置复杂的集成测试建立像什么,我与我的模块做:

$serviceLocator = ServiceManagerFactory::getServiceManager(); // see comment below 
$dbConnectionMock = $this->getMock('My\Db\Connection'); 

$serviceLocator->setAllowOverride(true); 
// replacing connection service with our fake one 
$serviceLocator->setService('connection_service_name', $dbConnectionMock); 

$service = $serviceLocator->get('service_that_uses_a_connection'); 

您可以在https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php

找到的DoctrineORMModuleServiceManagerFactory一个例子这工作假设service_that_uses_a_connection由注入connection_service_name的工厂实例化。

如果您愿意,您仍然可以使用Zend\Di,但在这种情况下并非真正需要。

+1

谢谢你的帮助!希望有一天Zend的文档将会清晰明了! – AgileTillIDie

+2

@AgileTillIDie请务必为自己贡献! https://github.com/zendframework/zf2-documentation - 如果你没有GIT-fu,你仍然可以在Github UI上在线编辑它。 – Ocramius