ユニットテストのときの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