Zend的好人和一些博主推荐ZF2的新服务定位器/管理器,而不是内置的依赖注入系统。
我的问题是,将模拟对象注入服务是否可行/方便?我在模块的PHPUnit引导程序中看到了一些略显笨拙的尝试。但是有没有办法像ZF1 + Yadif一样使用这个干净方便的服务系统?
答案 0 :(得分:13)
是的,您可以将模拟对象注入服务。对于单元测试,服务定位器甚至不起作用:
$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
中找到DoctrineORMModule
的示例
这可以假设service_that_uses_a_connection
由注入connection_service_name
的工厂实例化。
如果您愿意,您仍然可以使用Zend\Di
,但在这种情况下并不是真的需要。