Ja, Sie können Mock-Objekte in einen Dienst injizieren. Für ein Gerät zu testen, wird der Dienst-Locator nicht einmal ins Spiel kommen:
$service = new MyService($mockDependency);
Wenn Sie schreiben, komplexe Integrationstests, wo Sie müssen den Service Locator verwenden, um mit einer grafischen Darstellung der Abhängigkeiten und Mocks konfiguriert werden, können Sie Setup etwas wie das, was ich mit meiner Module tue:
$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');
Sie ein Beispiel für ServiceManagerFactory
in DoctrineORMModule
bei https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php
, dass dies funktioniert unter der Annahme, finden service_that_uses_a_connection
wird von einer Fabrik instanziiert, die connection_service_name
hinein injiziert.
Sie können auch noch Zend\Di
verwenden, wenn Sie bevorzugen, aber es ist nicht wirklich in solchen Fällen erforderlich.
Vielen Dank für Ihre Hilfe! Hoffentlich eines Tages wird die Zend Dokumentation so klar sein! – AgileTillIDie
@AgileTillIDie bitte tragen Sie selbst bei! https://github.com/zendframework/zf2-documentation - wenn du kein GIT-fu hast, kannst du es online in der Github UI bearbeiten. – Ocramius