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の結果をキープしておいて、それをもとにメソッドを追加していくような時に有用である。