Tôi đã phải chế giễu các chức năng yêu cầu HTTP của WordPress trong một số trường hợp và vì vậy tôi đã quyết định xây dựng một công cụ để thực hiện điều đó: WP HTTP TestCase
Về cơ bản nó cung cấp một cách dễ dàng để làm những điều khác nhau mà các câu trả lời khác đã vạch ra. Từ bài đọc:
WP HTTP Testcase
Testcase PHPUnit để kiểm tra mã sử dụng WP_Http
lớp của WordPress .
Nếu bạn sử dụng wp_remote_request()
hoặc các trình bao bọc khác cho WP_Http
các phương thức trong mã của mình, điều này gây khó khăn cho việc kiểm tra, đặc biệt là nếu máy chủ từ xa có thể không truy cập được từ môi trường thử nghiệm của bạn. Testcase này giải quyết điều này bằng cách cho phép bạn định tuyến các yêu cầu của mình đến một địa chỉ máy chủ khác, sử dụng một bộ phản hồi được lưu trong bộ nhớ cache hoặc chỉ chế giễu các phản hồi từ xa bằng cách cung cấp các phản hồi nhân tạo.
Cài đặt
Bạn có thể cài đặt gói này bằng trình soạn thảo:
composer require --dev jdgrimes/wp-http-testcase:~1.1
Sử dụng
Để sử dụng nó trong mã của bạn, trước tiên bạn cần bao gồm
wp-http-testcase.php
tệp trong tệp bootstrap PHPUnit của bạn. Nếu bạn sẽ sử dụng các tính năng lưu trữ định tuyến và phản hồi của máy chủ lưu trữ, bạn sẽ cần gọi WP_HTTP_TestCase::init()
trong tệp bootstrap của mình.
Sau đó, trong các thử nghiệm liên quan đến WP_Http
bạn, bạn cần gia hạn
WP_HTTP_TestCase
thay vì WP_UnitTestCase
như bình thường.
Phản hồi nhạo báng
Sử dụng bộ đệm phản hồi
Cách tốt nhất để kiểm tra, khi có thể, đó là thiết lập một máy chủ giả để xử lý các yêu cầu. Trong một số trường hợp, bạn có thể muốn hoặc thực sự cần gửi các yêu cầu thông qua máy chủ thực và điều đó cũng có thể được thực hiện. Những việc bạn làm sẽ phụ thuộc vào bản chất của các yêu cầu và tác dụng phụ mà chúng tạo ra trên máy chủ người nhận.
Thiết lập máy chủ thử nghiệm
Ví dụ: nếu bạn đang kiểm tra một plugin tạo yêu cầu cho API được cung cấp bởi một plugin hoặc phần mềm khác, bạn có thể không muốn hoặc không cần kiểm tra điều này trên một trang web trực tiếp. Thay vào đó, bạn có thể thiết lập một trang web thử nghiệm hoặc sử dụng máy chủ cục bộ là một phần của môi trường phát triển của bạn. Ở đó bạn có thể cài đặt phần mềm xử lý các yêu cầu. Khi điều này được thực hiện, bạn có thể chạy thử nghiệm đối với trang web thử nghiệm như thế này:
WP_HTTP_TC_HOST=localhost phpunit
Chỉ cần thay thế localhost
bằng tên máy chủ của máy chủ cục bộ. Lưu ý rằng các WP_HTTP_TC_*
cờ có thể được định nghĩa là các hằng PHP hoặc là các biến môi trường bash như trên. Sau này sẽ được ưu tiên.
Kích hoạt bộ đệm
Tất nhiên điều này sẽ chậm hơn nhiều so với hầu hết các bài kiểm tra đơn vị khác, bởi vì các yêu cầu bị ràng buộc phải mất một chút thời gian. Đó là nơi bộ nhớ đệm xuất hiện. Khi bật bộ đệm, phản hồi cho từng yêu cầu được lưu trong bộ nhớ cache lần đầu tiên được chạy và phiên bản được lưu trong bộ nhớ cache sẽ được sử dụng trong tương lai. Điều này có nghĩa là các bài kiểm tra của bạn có thể vẫn nhanh như chớp.
Để bật bộ đệm, chỉ cần thêm phần này vào bootstrap của bạn:
define( 'WP_HTTP_TC_USE_CACHING', true );
Có lẽ bạn cũng muốn chỉ định thư mục để lưu bộ đệm vào, thông qua WP_HTTP_TC_CACHE_DIR
. Bạn có thể sử dụng nhiều nhóm bộ đệm và chuyển đổi giữa chúng bằng cách sử dụng WP_HTTP_TC_CACHE_GROUP
.
Sử dụng máy chủ trực tiếp
Tuy nhiên, có trường hợp thứ hai, trong đó bạn không thể thiết lập máy chủ thử nghiệm. Một ví dụ trong trường hợp này sẽ là trường hợp nếu plugin của bạn thực hiện các yêu cầu đối với API do GitHub cung cấp. Tùy thuộc vào tình huống, có thể thực sự khả thi khi thực hiện các yêu cầu cho người nhận "trực tiếp". Vấn đề chính một lần nữa là các yêu cầu sẽ khiến các bài kiểm tra mất nhiều thời gian để hoàn thành. Cũng có khả năng API không phải lúc nào cũng có thể truy cập được từ môi trường thử nghiệm của bạn hoặc các thử nghiệm của bạn cuối cùng sẽ đập API quá mạnh và bạn sẽ bị chặn. Đây là nơi bộ nhớ đệm có thể giúp bạn. Bạn chỉ cần chạy thử nghiệm với API "trực tiếp" một lần và phần còn lại bạn có thể kiểm tra bằng các phản hồi được lưu trong bộ nhớ cache.
Cung cấp phản hồi nhân tạo
Tất nhiên, có thể đôi khi không thể tạo máy chủ thử nghiệm và cũng không khả thi để chạy với máy chủ trực tiếp. Trong trường hợp này, bạn có thể muốn mã hóa các câu trả lời nhân tạo cứng vào các bài kiểm tra của mình. Đây là cách bạn có thể làm điều đó:
Trước khi gọi mã sẽ gọi yêu cầu HTTP, bạn cần đặt hàm để giả lập các phản hồi như sau:
$this->http_responder = array( $this, 'mock_server_response' );
Hàm trả lời HTTP sẽ được chuyển qua hai đối số, đối số yêu cầu và URL mà yêu cầu được dành cho.
protected function mock_server_response( $request, $url ) {
return array( 'body' => 'Test response.' );
}
Để biết danh sách đầy đủ các $request
đối số và phản hồi, xem
WP_Http::request()