vcr で rspec の外部 api 呼び出しをキャッシュする
概要
外部 api に依存したコードのテストを書く場合、毎回 api を呼び出すのは避けたいです。
そんな時は api 呼び出しを stub にするのが回避策としてありますが vcr を使うと一度呼び出した api を自動的に stub にしてくれて便利です。
インストール
bundle add で vcr と webmock をインストールします。
bundle add -g test vcr webmock
vcr の設定を追加します。
require 'vcr'
VCR.configure do |config|
config.cassette_library_dir = "spec/fixtures/vcr_cassettes"
config.hook_into :webmock
end
テストを書く
vcr をインストールしたらテストを書いてみます。
こんな感じで use_cassette に block を渡します。
it 'calls the api' do
VCR.use_cassette("todo1") do
body = URI.parse("https://jsonplaceholder.typicode.com/todos/1").read
data = JSON.parse(body)
expect(data['userId']).to eq 1
end
end
テストを実行すると api が呼び出され、その内容がファイルに保存されます。
次回以降はこちらのファイルを使って api の呼び出しを stub してくれるようになります。