webmockでHTTPリクエストをstubしてファイルの中身を返す
移転しました →
ユニットテストのときのAPIリクエストは本当にAPIをたたくのではなくstubしておくことで、決まったレスポンスを受け取ってテストしやすくするという話です。よくある話ですね。
RSpecを含めいろいろなテストフレームワークに対応しているHTTPリクエストをstubするライブラリ、bblimke/webmockがいい感じです。他のを知っているわけではないですが、そこそこ使われている感じだったので全然問題ないと思います。
返したい内容を書いたファイルを用意しておく
想定しているリクエストに応じて必要なファイルを用意します。あ、その前に想定しているディレクトリ階層はこんな感じ。
. └── spec ├── fixtures │ ├── file1.html │ ├── file2.xml │ └── file3.json └── spec_helper.rb ☄
fixtures
ディレクトリにレスポンス用ファイルを置いておくことにしています。
webmockでファイルを指定する
tubするときにRubyのファイルクラスを用いてファイルを指定するとそのファイルの内容をHTTPのレスポンスとして返すことができるようになります。
stub_request(:get, "http://example.com/").to_return(body: File.new("path_to_file.html"))
これ以降http://example.com/
へのgetリクエストはpath_to_file.html
を結果として返すようになります。パラメータをつけたりいろいろできるのですが、そのあたりはREADMEを見た方が早いです(´・ω・`)
これでAPIリクエストの結果に相当するようなjsonファイルを書いておいてテストに使うことができますね。これはめでたい。
ファイル名で簡単に指定できるようにしておくと便利
fixtures
ディレクトリ内のファイル名だけでレスポンスを指定できるようにspec_helper.rb
にメソッドを定義しておくと楽です。
def fixture_path File.expand_path("../fixtures", __FILE__) end def fixture(file) File.new(File.join(fixture_path, file)) end