Assets.github.com%2fimages%2fgravatars%2fgravatar-user-420

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

  • haman29@github
  • iR3
  • akishin
  • flada_auxv
  • nysalor
  • ppworks
  • guan@github
  • doipo
  • akicho8
  • hrst
  • nagita_
  • yaotti
Edit

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



Sign up and follow sawamur@github :)

Sign up with GitHub/Twitter

x close