Sì, è possibile iniettare oggetti fittizi in un servizio. Per un test di unità, il localizzatore di servizio non ha nemmeno entrare in gioco:
$service = new MyService($mockDependency);
Se si sta scrivendo i test di integrazione complessi in cui è necessario utilizzare il Servizio Locator essere configurato con un grafico delle dipendenze e schernisce, è possibile messa a punto qualcosa di simile a quello che sto facendo con i miei moduli:
$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');
È possibile trovare un esempio di ServiceManagerFactory
in DoctrineORMModule
a https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php
questo funziona assumendo che service_that_uses_a_connection
è istanziato da una fabbrica che inietta connection_service_name
in esso.
Si può ancora usare anche Zend\Di
se si preferisce, ma in questi casi non è veramente necessario.
Grazie per il vostro aiuto! Speriamo che un giorno la documentazione di Zend sarà chiara! – AgileTillIDie
@AgileTillIDie, per favore, contribuisci! https://github.com/zendframework/zf2-documentation - se non hai GIT-fu, puoi comunque modificarlo online nell'interfaccia di Github. – Ocramius