9

Die guten Leute bei Zend und eine Reihe von Bloggern empfehlen den neuen Service Locator/Manager für ZF2 und nicht das eingebaute Dependency Injection System.ZF2 Service Locator & Dependency Injection

Meine Frage ist, ist es möglich/bequem, Mock Objekte in einen Dienst zu injizieren? Ich habe einige etwas ungeschickte Versuche gesehen, dies im PHPUnit Bootstrap eines Moduls zu tun; Aber gibt es eine Möglichkeit, dieses Service-System zu nutzen, das so sauber und praktisch ist wie z. B. ZF1 + Yadif?

Antwort

12

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.

+1

Vielen Dank für Ihre Hilfe! Hoffentlich eines Tages wird die Zend Dokumentation so klar sein! – AgileTillIDie

+2

@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