dependency injection - inyeccion - Localizador de servicios ZF2 e inyección de dependencia
inyeccion de dependencias spring (1)
Las buenas personas de Zend, y varios bloggers, están recomendando el nuevo localizador / administrador de servicios para ZF2, en lugar de su sistema de inyección de dependencias incorporado.
Mi pregunta es, ¿es posible / conveniente inyectar objetos simulados en un servicio? He visto algunos intentos ligeramente torpes de hacer esto en el arranque de PHPUnit de un módulo; pero, ¿hay alguna forma de utilizar este sistema de servicio que sea tan limpio y conveniente como, por ejemplo, ZF1 + Yadif?
Sí, puedes inyectar objetos simulados en un servicio. Para una prueba unitaria, el localizador de servicios ni siquiera entra en juego:
$service = new MyService($mockDependency);
Si está escribiendo pruebas de integración complejas donde necesita usar el Localizador de servicios para configurar un gráfico de dependencias y burlas, puede configurar algo así como lo que estoy haciendo con mis módulos:
$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'');
Puede encontrar un ejemplo de ServiceManagerFactory
en DoctrineORMModule
en https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php
Esto funciona suponiendo que service_that_uses_a_connection
es instanciado por una fábrica que inyecta connection_service_name
en él.
También puede usar Zend/Di
si lo prefiere, pero en realidad no es necesario en tales casos.