2017-09-20 2 views
0

원격 종단점 대응을위한 원격 3D 파티 API를 테스트 할 수 있기를 원합니다. 따라서 로컬 rspec 테스트를 작성하고 정기적으로 실행하여보고 싶습니다. 이러한 엔드 포인트가 심각한 변경없이 예상대로 작동하는 경우 내 응용 프로그램이 끊임없이 변화하는 API에 크게 의존하기 때문에 테스트를 자동화하기위한 선택의 여지가 거의 없습니다.RSpec에서 실제 JSON 게시 요청 보내기

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에 대신 전체 http://123.45.67.89/api/endpoint의 URL의 /api/endpoint URL을 타격한다는 것입니다 : 순간

나는 정기적 RSpec에 API 테스트 코드를했다. 어떻게이 행동을 바꿀 수 있습니까?

답변

1

RSpec의 요청 사양은 실제 HTTP 요청을 보내어 자신의 응용 프로그램을 테스트하기위한 것입니다. 로컬 HTTP 호스트는 로컬 호스트가 아닌 다른 호스트를 요청할 수있는 구성 원숭이 일 수도 있지만 원격 HTTP 요청을 수행하기위한 것이 아닙니다.

요청 사양이 모든 예에서 API를 강타합니다. 이는 속도 제한 및 조절에 문제를 일으킬 수 있습니다.

요청 사양에 Net::HTTP, Httparty 또는 Typhoeus과 같은 HTTP 라이브러리를 사용해 볼 수도 있지만 실제로해야 할 일은 방법론을 다시 생각해 보는 것입니다. 응용 프로그램과 외부 공동 작업자 간의 상호 작용을 격리하는 것이 좋습니다.

이 일을하는 한 가지 방법은 원격 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 

당신은 다음 일반 올드 루비 개체와 같은 클라이언트를 테스트하여 원격 엔드 포인트를 테스트 할 수 있습니다

원격 API가 변경되면 단일 구성 요소 (클라이언트) 만 실패하므로 응용 프로그램의 변경에 대한 노출을 제한 할 수있는 추가 이점이 있습니다.

클라이언트를 소비하는 다른 구성 요소는 클라이언트를 스터 빙하여 원격 상호 작용을 쉽게 맺을 수 있습니다.