特定の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メソッドによる部分一致などがサポートされている。
これについては、以下を参照するとよい。