2011-10-24 31 views
6

Tôi gọi dịch vụ web của bên thứ ba ngay bây giờ là một phần của đơn đăng ký của tôi. Tôi đang sử dụng đá quý RestClient để làm điều này. Có rất nhiều công cụ có sẵn để làm điều tương tự, vì vậy điều đó không quan trọng.Ruby on Rails: Cách tốt nhất để kiểm tra cuộc gọi không thành công tới API của bên thứ ba

Điều tôi tò mò là thử nghiệm đủ tốt, không có gì quá lạ mắt, nơi tôi có thể mô phỏng cách ứng dụng của tôi phản hồi khi dịch vụ web của bên thứ ba không khả dụng vì bất kỳ lý do gì. Có thể là tôi đã vượt quá giới hạn tốc độ hoặc thời gian chờ do độ trễ/biến chứng của mạng, tôi chỉ muốn có thể thực hiện một số thứ như mã trạng thái HTTP và kiểm tra ứng dụng của mình trong sự kiện đó.

Cách tốt nhất để thực hiện điều này bằng Test :: Unit là gì? Ngay bây giờ cuộc gọi đến dịch vụ bên thứ ba được đóng gói bên trong một trong các bộ điều khiển của tôi. Tôi có một mô-đun đơn giản với một số phương thức bao bọc cho các điểm kết thúc khác nhau của dịch vụ từ xa. Tôi chỉ muốn đảm bảo rằng đơn đăng ký của tôi thực hiện những điều đúng khi dịch vụ đó hoặc không có sẵn.

Có sử dụng một khung bổ sung bên cạnh Kiểm tra :: Đơn vị có thể 'khai thác' đúng cách để thực hiện việc này không? Rõ ràng là tôi không thể ép buộc thời gian chờ mạng và bắt đầu tấn công bằng những thứ như IPtables chỉ để thử nghiệm không đáng giá. Tôi chắc rằng vấn đề này đã được giải quyết hàng triệu lần khi tích hợp những thứ như Facebook và Twitter vào các ứng dụng web ngày nay rất phổ biến. Làm cách nào để bạn kiểm tra sự thất bại khi tiếp cận các API đó theo định dạng mạnh mẽ/được kiểm soát?

Trả lời

5

Tôi muốn giới thiệu sử dụng một cái gì đó như webmock để giả lập tất cả yêu cầu http của bạn (không chỉ để giả lập yêu cầu không thành công); nó sẽ tăng tốc rất nhiều bộ thử nghiệm của bạn thay vì phải thực sự nhấn dịch vụ của bên thứ ba mỗi khi bạn chạy thử nghiệm.

Webmock hỗ trợ Rest Client and Test :: Unit. Chỉ cần đặt mã này trong test/test_helper.rb tập tin của bạn:

require 'webmock/test_unit' 

Như một ví dụ, để kiểm tra một thời gian chờ mạng:

stub_request(:any, 'www.example.net').to_timeout 
RestClient.post('www.example.net', 'abc') # ===> RestClient::RequestTimeout 
1

railscast: 291 (thuê bao chỉ) nói về thử nghiệm với VCR và rspec (tôi biết, không phải nó không phải kiểm tra: Unit)

anyway bạn có thể nhìn vào sử dụng VCR cho các loại điều này

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