2017-09-20 18 views
0

遠隔地の3次元パーティ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 

このコードの問題ではなく、完全なhttp://123.45.67.89/api/endpoint、URLの、RSpecのは/api/endpoint URLに当たっているということです。この動作を変更するにはどうすればよいですか?

答えて

1

RSpecのリクエスト仕様は、実際のHTTPリクエストを送信することによって、独自のアプリケーションをテストするためのものです。リモートHTTP要求を実行するためのものではありません(たとえ、設定でmonkeyがlocalhost以外のホストを要求したとしても)。

とりわけ、要求仕様がすべての例でAPIをヒットします。これは、レート制限とスロットルに関する問題を引き起こします。

要求仕様にNet::HTTP,HttpartyまたはTyphoeusのようなHTTPライブラリを使用できますが、実際に行うべきことは、方法論を再考することです。アプリケーションと外部の共同作業者とのやりとりを分離することをお勧めします。これを行うための

一つの方法は、リモートAPIを消費クライアントクラスを作成することです:

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

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

その後、平野旧Rubyのオブジェクトのようにクライアントをテストすることによって、リモートエンドポイントをテストすることができます。

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 

これは、リモートAPIが変更された場合、単一のコンポーネント(クライアント)だけが失敗するため、アプリケーションの変更に対するエクスポージャを制限するという追加の利点があります。

クライアントを消費する他のコンポーネントは、クライアントをスタブすることで、リモートからのやりとりを簡単に行うことができます。

関連する問題