VCR
v-6.0.0
v-6.0.0
  • Introduction
  • Upgrade
  • Changelog
  • About These Examples
  • License
  • Contributing
  • Cassettes
    • Cassette Format
    • Naming
    • Error for HTTP Request Made When No Cassette Is in Use
    • Dynamic ERB Cassettes
    • Automatic Re-Recording
    • Exclusive Cassette
    • Update Content Length Header
    • Decode Compressed Response
    • Allow Unused HTTP Interactions
    • Freezing Time
  • Record modes
    • Once
    • New Episodes
    • None
    • All
    • Record on Error
  • Configuration
    • Cassette Library Dir
    • Hook Into
    • Default Cassette Options
    • Ignore Request
    • Filter Sensitive Data
    • Allow HTTP Connections When No Cassette
    • Debug Logging
    • Preserve Exact Body Bytes
    • URI Parser
    • Query Parser
  • Hooks
    • Before Record Hook
    • Before Playback Hook
    • Before HTTP Request Hook
    • After HTTP Request Hook
    • Around HTTP Request Hook
  • Request matching
    • Introduction
    • Matching on Method
    • Matching on URI
    • Matching on Host
    • Matching on Path
    • Matching on Query String
    • Matching on Body
    • Matching on Headers
    • Identical Requests Are Replayed in Sequence
    • Register and Use a Custom Matcher
    • URI Without Param(s)
    • Playback Repeats
    • Matching on Body as JSON
  • Test frameworks
    • Usage With Test::Unit
    • Usage With RSpec Metadata
    • Usage With Cucumber
  • Middleware
    • Rack
    • Faraday Middleware
  • HTTP Libraries
    • Net::HTTP
    • EM HTTP Request
Powered by GitBook
On this page
  • Background ()
  • Use :vcr metadata
  • :allow_unused_http_interactions => false causes a failure if there are unused interactions
  • :allow_unused_http_interactions => false does not raise if the example already failed
  • Pass a hash to set the cassette options

Was this helpful?

  1. Test frameworks

Usage With RSpec Metadata

VCR provides easy integration with RSpec using metadata. To set this up, call configure_rspec_metadata! in your VCR.configure block.

Once you've done that, you can have an example group or example use VCR by passing :vcr as an additional argument after the description string. It will set the cassette name based on the example's full description.

If you need to override the cassette name or options, you can pass a hash (:vcr => { ... }).

Background ()

Given a file named "spec/spec_helper.rb" with:

require 'vcr'

VCR.configure do |c|
  c.cassette_library_dir = 'spec/cassettes'
  c.hook_into :webmock
  c.configure_rspec_metadata!
end

RSpec.configure do |c|
  # so we can use `:vcr` rather than `:vcr => true`;
  # in RSpec 3 this will no longer be necessary.
  c.treat_symbols_as_metadata_keys_with_true_values = true
end

And a previously recorded cassette file "spec/cassettes/Group/optionally_raises_an_error.yml" with:

--- 
http_interactions: 
- request: 
    method: get
    uri: http://example.com/foo
    body: 
      encoding: UTF-8
      string: ""
    headers: {}
  response: 
    status: 
      code: 200
      message: OK
    headers: 
      Content-Length: 
      - "5"
    body: 
      encoding: UTF-8
      string: Hello
    http_version: "1.1"
  recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
recorded_with: VCR 2.0.0

Use :vcr metadata

Given a file named "spec/vcr_example_spec.rb" with:

$server = start_sinatra_app do
  get('/') { "Hello" }
end

def make_http_request
  Net::HTTP.get_response('localhost', '/', $server.port).body
end

require 'spec_helper'

describe "VCR example group metadata", :vcr do
  it 'records an http request' do
    expect(make_http_request).to eq('Hello')
  end

  it 'records another http request' do
    expect(make_http_request).to eq('Hello')
  end

  context 'in a nested example group' do
    it 'records another one' do
      expect(make_http_request).to eq('Hello')
    end
  end
end

describe "VCR example metadata" do
  it 'records an http request', :vcr do
    expect(make_http_request).to eq('Hello')
  end
end

When I run rspec spec/vcr_example_spec.rb

Then it should pass with "4 examples, 0 failures"

And the file "spec/cassettes/VCR_example_group_metadata/records_an_http_request.yml" should contain "Hello"

And the file "spec/cassettes/VCR_example_group_metadata/records_another_http_request.yml" should contain "Hello"

And the file "spec/cassettes/VCR_example_group_metadata/in_a_nested_example_group/records_another_one.yml" should contain "Hello"

And the file "spec/cassettes/VCR_example_metadata/records_an_http_request.yml" should contain "Hello".

:allow_unused_http_interactions => false causes a failure if there are unused interactions

And a file named "spec/vcr_example_spec.rb" with:

require 'spec_helper'

describe "Group", :vcr => { :allow_unused_http_interactions => false } do
  it 'optionally raises an error' do
    # don't fail
  end
end

When I run rspec spec/vcr_example_spec.rb

Then it should fail with an error like:

There are unused HTTP interactions left in the cassette:
  - [get http://example.com/foo] => [200 "Hello"]

:allow_unused_http_interactions => false does not raise if the example already failed

And a file named "spec/vcr_example_spec.rb" with:

require 'spec_helper'

describe "Group", :vcr => { :allow_unused_http_interactions => false } do
  it 'optionally raises an error' do
    raise "boom"
  end
end

When I run rspec spec/vcr_example_spec.rb

Then it should fail with "boom"

And the output should not contain "There are unused HTTP interactions".

Pass a hash to set the cassette options

Given a file named "spec/vcr_example_spec.rb" with:

require 'spec_helper'

vcr_options = { :cassette_name => "example", :record => :new_episodes }
describe "Using an options hash", :vcr => vcr_options do
  it 'uses the provided cassette name' do
    expect(VCR.current_cassette.name).to eq("example")
  end

  it 'sets the given options' do
    expect(VCR.current_cassette.record_mode).to eq(:new_episodes)
  end
end

When I run rspec spec/vcr_example_spec.rb

Then it should pass with "2 examples, 0 failures".

PreviousUsage With Test::UnitNextUsage With Cucumber

Last updated 4 years ago

Was this helpful?