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');
您可以在https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php找到一个ServiceManagerFactory
的例子,它在DoctrineORMModule
中。
假设service_that_uses_a_connection
由注入connection_service_name
的工厂实例化,则此方法适用。
如果您喜欢,仍然可以使用Zend\Di
,但在这种情况下并不是真正必需的。