酒と泪とRubyとRailsと

Ruby on Rails と Objective-C は酒の肴です!

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

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

ちなみにこのGemは、アジャイル/TDD系で有名なHIROCASTERさんのブログ『webmockとvcrを利用してHTTPのmockを作成する | Act as Professional - hiroki.jp』を見て初めて知りました〜^^


VCRとは?

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

Gemのインストール

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

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

設定

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

1
2
3
4
5
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での設定を表示します。

1
2
3
4
5
6
7
8
9
10
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が作成されます。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
---
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

Special Thanks

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

How To Use The VCR Gem With Rails And Rspec

おすすめの書籍