Tak, można wstrzykiwać fałszywe obiekty do usługi. Dla testów jednostkowych, lokalizator usługa nawet nie wchodzą w grę:
$service = new MyService($mockDependency);
Jeśli piszesz kompleksowe testy integracyjne, w których trzeba użyć lokalizatora usług być skonfigurowany z wykresu zależności i mocks można konfiguracja coś, co robię z moim modułów:
$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');
można znaleźć przykład ServiceManagerFactory
w DoctrineORMModule
na https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php
Działa to przy założeniu, że service_that_uses_a_connection
jest tworzone przez fabrykę, która wprowadza do niej connection_service_name
.
Możesz nadal używać także Zend\Di
, jeśli chcesz, ale w takich przypadkach nie jest to naprawdę potrzebne.
Dziękuję za pomoc! Mam nadzieję, że pewnego dnia dokumentacja Zend będzie tak jasna! – AgileTillIDie
@AgileTillIDie proszę Zrób to sam! https://github.com/zendframework/zf2-documentation - jeśli nie masz GIT-fu, nadal możesz edytować go online w interfejsie Github. – Ocramius