WebMock でリクエストごとにレスポンスを変更する

RSpec などで外部 API のリクエストを WebMock を使ってスタブしている環境で、リクエストごとにレスポンスを変更したいときのメモ。

以下のように、.to_return に複数のレスポンスを記述することで、リクエストごとにレスポンスを変更することができる。

stub_request(:get, "https://example.com").
  to_return(
    { body: "1", status: 200 },
    { body: "2", status: 400 },
    { body: "3", status: 500 },
  )

.to_return を複数記述してもよい。

stub_request(:get, "https://example.com").
  to_return(body: "1", status: 200).
  to_return(body: "2", status: 400).
  to_return(body: "3", status: 500)

.times を使うことで少しだけシンプルに「ステータスコード 200 を 2 回返し、それ以降はステータスコード 400 を返す」といったスタブを定義することが可能。

stub_request(:get, "https://example.com").
  to_return(status: 200).times(2).
  to_return(status: 400)

詳しくは WebMock のテストケースをどうぞ。

サンプル

実装は以下を想定。

def request
  Faraday.get("https://example.com")
end

テストケースは以下。

describe "#request" do
  before do
    stub_request(:get, "https://example.com").to_return(
      { body: "1", status: 200 },
      { body: "2", status: 400 },
      { body: "3", status: 500 },
    )
  end

  it do
    expect(request.status).to eq(200)
    expect(request.status).to eq(400)
    expect(request.status).to eq(500)

    # 定義したスタブ以上のリクエストは最後に定義したスタブが返される
    expect(request.status).to eq(500)
  end
end

© 2023 暇人じゃない. All rights reserved.