VCRを使うとRSpecのWebmockの作成が超絶楽になった!


RSpecでWebアクセスをするクラスをテストする際にモックの機能を提供してくれるので有名なのが『webmock』です。ただアクセスするWebサイトの数が増えると、Webmock用のデータ作成や管理が面倒になってしまいがちです。そんな時に助けてくれるのが、『VCR』です。


🚜 VCRとは?

VCRとはテストで使う『HTTP通信』を1回目に記録しておいて、2回目以降のテストでの実行時間を短縮し、効率的なテストを支援してくれるGemです。Webmockと組み合わせて使うことができます。

🗻 Gemのインストール

Gemfileに以下を追加して、コンソールでbundleを実行してください。

group :test do
# HTTP requests用のモックアップを作ってくれる
gem 'webmock'
gem 'vcr'
end

🐰 設定

spec/spec_helper.rb内に次の設定を追加。

VCR.configure do |c|
c.cassette_library_dir = 'spec/vcr'
c.hook_into :webmock
c.allow_http_connections_when_no_cassette = false
end

🏀 使い方

specファイル内のhttpで通信をしている部分で以下のようにして使います。
ここではサンプルとして、spec/model/your_model_spec.rbでの設定を表示します。

describe YourModel do
  describe "#call_api" do
     it "gets a response from an api" do
       VCR.use_cassette 'model/api_response' do
          response = call_api(api_url)
          response.first.should == "hello world"
       end
     end
  end
end

これを実行すると、spec/vcr/model/api_response.ymlが作成されます。

---
http_interactions:
- request:
method: get
uri: http://www.example.com/
body:
encoding: US-ASCII
string: ''
headers:
Accept:
- ! '*/*'
User-Agent:
- Ruby
response:
status:
code: 200
message: !binary |-
T0s=
headers:
!binary "RGF0ZQ==":

これで2回目以降のアクセスではWebアクセスする代わりに、spec/vcr/model/api_response.ymlを使ってテストしてくれます。

🏈 公式サイト

最後に公式のGitHubの紹介です。

vcr/vcr · GitHub

🤔 参考リンク

webmockとvcrを利用してHTTPのmockを作成する | Act as Professional - hiroki.jp

How To Use The VCR Gem With Rails And Rspec

📚 おすすめの書籍