9

Những người tốt tại Zend, và một số blogger, đang đề xuất định vị dịch vụ mới/quản lý cho ZF2, chứ không phải là hệ thống phụ thuộc của nó Injection Injection.ZF2 dịch vụ định vị & phụ thuộc tiêm

Câu hỏi của tôi là, có thể/thuận tiện để đưa các đối tượng giả vào dịch vụ không? Tôi đã thấy một số nỗ lực hơi vụng về để làm điều này trong PHPUnit bootstrap của một module; nhưng có cách nào để sử dụng hệ thống dịch vụ này sạch sẽ và tiện lợi như ZF1 + Yadif không?

Trả lời

12

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.

+1

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

+2

@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

Các vấn đề liên quan