외부 API와 작동하는 코드를 테스트하는 방법: Sinatra의 스텁

상황을 상상해 보십시오. 애플리케이션이 카드 요금을 담당하는 외부 서비스에 의존합니다. 이 서비스에는 작은 API가 있습니다. 사용자 ID로 카드 번호(마스크)를 가져오고 사용자로부터 달러X를 청구합니다. 이 API와 함께 작동하는 코드를 어떻게 테스트합니까?

물론 실제로 테스트에서 해당 외부 서비스를 요청할 수 있습니다. 어쩌면 그러한 경우를 위한 샌드박스가 있을 수도 있습니다. 그러나이 솔루션은 그다지 효율적이지 않습니다. 우선 테스트 속도가 느려집니다. 모든 요청에는 시간 비용이 있습니다. 둘째, 테스트를 불안정하게 만듭니다. 네트워크 문제로 인해 테스트가 무작위로 실패합니다. 셋째, 항상 가능한 것은 아닙니다. 외부 서비스에 샌드박스가 없거나 엄격한 요청 제한이 있을 수 있습니다.

이러한 경우 외부 서비스용 스텁을 사용하는 것이 좋습니다. 나는 외부 서비스에 따라 스텁의 네 가지 옵션을 사용합니다. 내 것입니까 아니면 다른 사람의 것입니까, 안정적입니까 아니면 자주 변경됩니까?

옵션 중 하나는 Sinatra의 가짜 서비스입니다. 이것과 같이:

let(:fake_api) do
  Class.new Sinatra::Base do
    get "/users/:user_id/card" do
      content_type :json

      { number: "4111...1111" }.to_json
    end
  end
end

before do
  stub_request(:any, /api.nanocashier.com/).to_rack(fake_api)
end


위의 코드에는 두 가지 흥미로운 점이 있습니다. 첫째, Class.newSinatra::Base 부모와 함께 let 테스트에서 전역 상수를 추가하지 않도록 합니다. 둘째, 모든 요청을 랙 애플리케이션으로 라우팅하는 Webmock의 stub_request입니다.

자체 스텁이 없는 외부 서비스(예: stripe-ruby-mock)를 조롱해야 하고 어댑터와 같은 스텁을 만드는 것이 불가능할 때 이러한 랙 기반 스텁을 사용합니다.

좋은 웹페이지 즐겨찾기