Zend 的优秀人员和许多博主都在推荐 ZF2 的新服务定位器/管理器,而不是其内置的依赖注入系统。
我的问题是,将模拟对象注入服务是否可能/方便?我在模块的 PHPUnit 引导程序中看到了一些稍微笨拙的尝试;但是有没有像 ZF1 + Yadif 这样干净方便的服务系统使用方法呢?
Zend 的优秀人员和许多博主都在推荐 ZF2 的新服务定位器/管理器,而不是其内置的依赖注入系统。
我的问题是,将模拟对象注入服务是否可能/方便?我在模块的 PHPUnit 引导程序中看到了一些稍微笨拙的尝试;但是有没有像 ZF1 + Yadif 这样干净方便的服务系统使用方法呢?
是的,您可以将模拟对象注入到服务中。对于单元测试,服务定位器甚至没有发挥作用:
$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');
您可以在ServiceManagerFactory
https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php找到一个示例DoctrineORMModule
假设它service_that_uses_a_connection
是由注入connection_service_name
它的工厂实例化的。
如果您愿意,您仍然可以使用Zend\Di
,但在这种情况下并不需要它。