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