はじめに
外部 API のリクエストを含むテストを試したいと思ったときに、Webmock という gem でリクエストをスタブ化できることを知りました。
有名な gem なのかもしれませんが、使ったことがまだなかったので、簡単に使い方を試してみました。
前提環境
- Mac OS X 10.14.4
- Rails 5.2.2.1
- ruby 2.5.5p157 (2019-03-15 revision 67260)]
試し方
今回は WebMock の使い方をすぐに確認したかったので、予め準備しておいたサンプルの Rails アプリのコンソール上で、 Webmock のメソッドの使い方を確認します。
手順
インストール
Gemfile
に Webmock をインストールします。
gem 'webmock'
下準備
rails c
でコンソールを起動したら、Webmock を利用できるよう、有効化の設定を入れます。
require 'webmock'
include WebMock::API
WebMock.enable!
こちらによって、WebMock のスタブへのリクエストに切り替わります。
README のサンプルを試す
下準備が終わったら、README を参考に、いくつかサンプルを試します。
URL のみのスタブリクエスト
以下のコードで、ダミーの URL である www.example.com
へのすべてのリクエストが許可される形になります。
stub_request(:any, "www.example.com")
Net::HTTP.get("www.example.com", "/")
# => ""
クエリパラメータ付き URL のみのスタブリクエスト
クエリパラメータなど、変数に当たる部分は {?}
という形で囲むことで使用することができます。
uri_template = Addressable::Template.new "www.example.com/users{?name}"
stub_request(:any, uri_template)
Net::HTTP.get('www.example.com', '/users?name=hoge')
# => ""
ダミーのレスポンスを指定
リクエスト先の URL に対してダミーのレスポンスを指定できます。
stub_request(:any, "www.example.com")
.to_return(body: "aaa", status: 200 )
Net::HTTP.get('www.example.com', '/')
# => "aaa"
レスポンスをテキストファイルで指定
別で保存しておいたテキストファイルをレスポンスとして指定することもできます。
File.open('/tmp/response.txt', 'w') { |f| f.puts 'bbb' }
stub_request(:any, "www.example.com").
to_return(body: File.new('/tmp/response.txt'), status: 200)
Net::HTTP.get('www.example.com', '/')
# => "bbb\n"
おわりに
こちらを応用すれば、 外部通信が伴う API クライアントが絡んだテストも、リクエストの URL さえわかればスタブ化してテストすることができそうです。
今回は試していませんが、リクエストヘッダありの POST リクエストもスタブ化できるようなので、利用の幅が広いなと感じました。
これから試してみようと思います。