Mock phụ thuộc trong thử nghiệm tích hợp Magento 2


8

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

Câu trả lời:


5

Bạn có thể sử dụng \ Magento \ TestFramework \ ObjectManager :: addSharedInstance cho việc này.

Thí dụ:

$objectManager->addSharedInstance($mock, TheInterface::class);

Hoạt động tốt nếu chưa có tùy chọn nào được đặt 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ẻ.
Fabian Schmengler

2
Trong trường hợp này, bạn cần thêm giao diện chia sẻ cho lớp ưa thích. cho người cũ nếu chúng tôi có <ưu tiên cho = "Psr \ Log \ LoggerInterface" type = "Magento \ Framework \ Logger \ Monolog" /> thì bạn nên thêm ví dụ được chia sẻ dưới dạng $ objectManager-> addSharedInstance ($ mock, "Magento \ Framework \ Logger \ Độc thoại ");
KAndy

Thật tuyệt, thật tuyệt!
Fabian Schmengler

Xin lưu ý rằng nếu bạn muốn giả định một loại ảo, bạn phải sử dụng tên của loại ảo, không phải tên lớp : $this->objectManager->addSharedInstance($mockedLogger, 'CustomLogger');. Biết điều này sẽ giúp tôi tiết kiệm được một giờ :-P
Giel Berkers
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.