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
とても簡単ですね!