Giả sử kịch bản sau đây:
- Tôi có một lớp thực hiện các cuộc gọi đến một dịch vụ bên ngoài
- Lớp thực hiện một giao diện và được định nghĩa là triển khai ưa thích cho giao diện này trong
di.xml
- Một khối nhận giao diện này là tham số hàm tạo
- Tôi muốn kiểm tra yêu cầu Magento trong thử nghiệm tích hợp sử dụng khối này
Tôi không thực sự muốn gọi dịch vụ bên ngoài, vì vậy tôi muốn chế giễu lớp đó và tự hỏi cách tốt nhất để làm như vậy là gì.
Tôi biết rằng bạn có thể xác định tùy chọn DI khi đang di chuyển với
$objectManager->configure(
['preferences' => [TheInterface::class => MockClass::class]]
);
nhưng điều này đòi hỏi phải tự xác định một lớp giả MockClass
, tôi không thể sử dụng một đối tượng giả PHPUnit.
Điều này hoạt động tốt nếu lớp được tiêm là một nhà máy vì tôi có thể tạo một nhà máy giả tạo ra đối tượng giả thực tế.
Nhưng đây là cách duy nhất hay tôi đang thiếu thứ gì đó?
Cập nhật:
Phương pháp được đề xuất
$objectManager->addSharedInstance($mock, TheInterface::class);
nhìn đầu tiên tốt, nhưng chỉ hoạt động miễn là không có sở thích được xác định. Những điều này có trước các trường hợp được chia sẻ.
Tôi đã cố gắng tự động loại bỏ các ưu tiên:
$this->objectManager->configure(
['preferences' => [TheInterface::class => null]]
);
Nhưng thật không may, Magento gọi ltrim($to, '\\')
đối số, chuyển đổi nó thành một chuỗi rỗng. Kết quả này trong:
ReflectionException: Class không tồn tại
di.xml
, nhưng tùy chọn dường như có mức độ ưu tiên so với thể hiện được chia sẻ.