PIYO - Tech & Life -

webmockでHTTPリクエストをstubしてファイルの中身を返す

Test Ruby

ユニットテストのときのAPIリクエストは本当にAPIをたたくのではなくstubしておくことで、決まったレスポンスを受け取ってテストしやすくするという話です。よくある話ですね。

RubyでRSpecを使っている場合です。

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