Edited at

VCRで外部APIとのやりとりを記録する

More than 5 years have passed since last update.

Railsなどでtestを書く場合、外部APIとのやりとりのあるテストは書きにくい。スピード的にも毎回外部APIにアクセスさせることは避けたい。

VCRを使うとHTTPのリクエストとレスポンスをYAMLファイルに保存してくれ、次回のテスト時にはそのリスクエスト結果が再現される


Gemfile

gem 'vcr'

gem 'webmock'

記録するYAMLが吐かれるディレクトリをtest/vcr_cassettesとすると下記のようにtest_helperで設定する


test/test_helper.rb

VCR.configure do |c|

c.cassette_library_dir = 'test/vcr_cassettes'
c.allow_http_connections_when_no_cassette = true #VCRブロック外のHTTP通信は許可する
c.hook_into :webmock # or :fakeweb
end

testファイルにて外部アクセスが走る処理のところをVCR.use_cassetteブロックで囲む。

例えば検索APIにアクセスするメソッドがあったとすると下記のようになる


test/unit/search_test.rb

test "search query" do 

VCR.use_cassette('search_query',:record => :new_episodes) do
# このブロックで発生するHTTPリスエスト/レスポンスが記録され、次回以降は再生される
@s = Search.query("foobar")
end
assert_equal "foorbar",@s.keyword
end

初回実行時に test/vcr_cassettes/search_query.yml が生成され、次回以降はその内容が再現される。

外部APIの結果をキープしておいて、それをもとにメソッドを追加していくような時に有用である。