2017-09-20 49 views
0

我希望能夠測試遠程的三方API端點響應,這就是爲什麼我想寫一堆本地rspec測試並定期啓動它們以查看如果這些端點按預期工作而不會發生重大變化。由於我的應用程序高度依賴於這個不斷變化的API,因此我除了自動化測試外別無選擇。從RSpec發送一個真正的JSON發佈請求

此刻,我是正規rspec的API測試代碼:

require "rails_helper" 

RSpec.describe "Remote request", type: :request do 
    describe ".send request" do 
    it ".posts valid data" do 
     post "http://123.45.67.89/api/endpoint", 
     params: { 
        "job_request_id": 123456, 
        "data": "12345", 
        "app_secret": "12345", 
        "options": { 
        ... 
        } 
       } 

     expect(JSON.parse response.body).to include("message" => "success") 
     expect(response).to have_http_status(200) 
    end 
    end 
end 

這段代碼的問題是,Rspec的是打的而不是完整的URL http://123.45.67.89/api/endpoint/api/endpoint網址。我怎樣才能改變這種行爲?

回答

1

RSpec的請求規範是用於測試你自己的應用程序 - 通過發送真正的HTTP請求。它們不用於執行遠程HTTP請求(即使配置可能會請求除localhost之外的其他主機)。

其中,每個示例都有一個請求規範將API命中 - 這會給您帶來速度限制和限制的問題。

儘管您可以嘗試在請求規範中使用HTTP庫(如Net::HTTP,HttpartyTyphoeus),但您真正應該做的是重新考慮您的方法。將應用程序與外部合作者之間的交互隔離是一個好主意。

這樣做的一種方式是通過創建耗費遠程API客戶端類:

require 'spec_helper' 
RSpec.describe ExampleAPIClient do 
    let(:client) { described_class.new } 

    describe "#get_some_data" do 
    let(:response) { client.get_some_data } 
    it "should be successful" do 
     expect(response.success?).to be_truthy 
    end 
    end 
end 

class ExampleAPIClient 
    include HTTParty 
    base_url 'example.com' 
    format :json 

    def get_some_data 
    self.class.get('/foo') 
    end 
end 

然後,您可以通過測試客戶端就像一個普通的老式Ruby對象測試遠程端點

由於只有單個組件(客戶端)在遠程API發生更改時應該失敗,因此這將具有限制應用程序更改的額外好處。

使用客戶端的其他組件可以通過對客戶端進行存根操作輕鬆地遠程存儲遠程交互。