Có, bạn có thể đưa các đối tượng giả vào dịch vụ. Đối với một bài kiểm tra đơn vị, định vị dịch vụ thậm chí không đi vào chơi:
$service = new MyService($mockDependency);
Nếu bạn đang viết các bài kiểm tra tích hợp phức tạp, nơi bạn cần phải sử dụng Locator Service được cấu hình với một đồ thị phụ thuộc và mocks, bạn có thể thiết lập một cái gì đó giống như những gì tôi đang làm với các module của tôi:
$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');
Bạn có thể tìm thấy một ví dụ về ServiceManagerFactory
trong DoctrineORMModule
tại https://github.com/doctrine/DoctrineORMModule/blob/0.7.0/tests/DoctrineORMModuleTest/Util/ServiceManagerFactory.php
này làm việc giả định rằng service_that_uses_a_connection
được khởi tạo bởi một nhà máy tiêm connection_service_name
vào nó.
Bạn vẫn có thể sử dụng Zend\Di
nếu muốn, nhưng không thực sự cần thiết trong những trường hợp như vậy.
Cảm ơn sự giúp đỡ của bạn! Hy vọng rằng một ngày Zend tài liệu sẽ được rõ ràng này! – AgileTillIDie
@AgileTillIDie vui lòng tự đóng góp! https://github.com/zendframework/zf2-documentation - nếu bạn không có GIT-fu, bạn vẫn có thể chỉnh sửa trực tuyến trong giao diện người dùng Github. – Ocramius