kakudooo docs

webmockで特定のパラメーターを含むリクエストを検証する方法について

特定のHTTPリクエストの呼び出しをスタブした上で、スタブしたリクエストが呼び出されたかどうかをテストしたいことがある。 withメソッドとhave_xxx系のメソッドを組み合わせることで実現可能なので、メモとして残しておく。

この土日は風邪で寝込んでいたので、溜め込んでいたスクラップを放出することにした。

実装例

webmockのREADME.mdの例を借りることにする。

個人的には、対象となるstubオブジェクトを明示的に指定したいので、基本的にグローバルスコープなWebMockオブジェクトを使うのではなく、例のように参照用の変数を作成した上で検証する方針がよいと考えている。

stub = stub_request(:post, "www.example.com").
  with(body: /world$/, headers: {"Content-Type" => /image\/.+/}).
  to_return(body: "abc")

uri = URI.parse('http://www.example.com/')
req = Net::HTTP::Post.new(uri.path)
req['Content-Type'] = 'image/png'

res = Net::HTTP.start(uri.host, uri.port) do |http|
  http.request(req, 'hello world')
end

expect(stub).to have_been_requested

withメソッドでは、あらかじめ期待されるリクエストパラメータ(headerやbody)を指定することができる。 完全一致や、正規表現やhash_includingメソッドによる部分一致などがサポートされている。 これについては、以下を参照するとよい。