5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 3 years have passed since last update.

RailsのRSpecで外部サービスを使ったAPIをテストする

Last updated at Posted at 2020-04-28

RailsでAPIを作成する際、外部サービスのAPIにリクエストを投げる処理が含まれている場合、webmockを使うとテストコードが簡単に書けたので、備忘録としてまとめておきます。
テスト時は実際に外部サービスにはリクエストを投げたくないので、外部サービスのレスポンスを返してくれるモックサーバーをwebmockで作成します。

webmockを導入する

テスト環境でモックサーバーを作成するためにwebmockというgemを導入します。
Gemfile に下記を追加し、 bundle install を実行してください。

group :development, :test do
  gem 'webmock'
end

RSpecにテストコードを追記

テストしたい箇所に、下記のように追記します。
今回は ./spec/requests/hoge_api_spec.rb にテストを作成していることを想定しています。

モックサーバーからのレスポンスは、 ./spec/fixtures/response.json にjson形式で作成しておきます(この場所も任意です)。

モックサーバーのurlは https://external_api_test としていますが、こちらも任意に決めることが出来ます。

require "rails_helper"
require "webmock/rspec"  # webmockをrequire

describe "Hoge API", type: :request do
  before do
    WebMock.enable!  # webmockを有効化
  end

  describe "POST /api" do
    context "with valid params" do
      it "return 200" do
        # モックサーバーからのレスポンスのjsonファイルを読み込み
        let(:external_api_response) { 
          ActiveSupport::JSON.decode(File.read("spec/fixtures/response.json")).to_json
        }

        # モックサーバーを起動
        stub_request(:post, "https://external_api_test").to_return(
          body: external_api_response,
          status: 200
        )

        post hoge_path, params: { params: "hoge" }
        expect(response).to have_http_status(200)
      end
    end

テスト時に叩かれる外部サービスのurlをモックサーバーのURLと同じものにする

先程、モックサーバーのurlを https://external_api_test としたので、テスト時に叩かれるurlを合わせておきます。
環境毎に指定をしている箇所を、下記のように修正します。

# モックサーバーのurlと合わせる
test:
  protocol: https
  host: external_api_test

development:
  protocol: http
  host: localhost
  port: 8080

production:
  protocol: https
  host: external_api

とても簡単ですね!

5
7
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
5
7

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?