Logo: Relish

  1. Sign up
  2. Sign in

Project: Vcr 2.0.0.beta2

Playback repeats

By default, each response in a cassette can only be matched and played back
once while the cassette is in use (it can, of course, be re-used in multiple
tests, each of which should use the cassette separately). Note that this is
a change from the behavior in VCR 1.x. The old behavior occurred because of
how FakeWeb and WebMock behave internally and was not intended. Repeats create
less accurate tests since the real HTTP server may not necessarily return the
same response when identical requests are made in sequence.

If you want to allow playback repeats, VCR has a cassette option for this:

:allow_playback_repeats => true
Scenarios
Responses do not repeat by default
Given
a previously recorded cassette file "cassettes/example.yml" with:
---
http_interactions:
- request:
    method: get
    uri: http://example.com/foo
    body: ''
    headers: {}
  response:
    status:
      code: 200
      message: OK
    headers:
      Content-Length:
      - '10'
    body: Response 1
    http_version: '1.1'
  recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
- request:
    method: get
    uri: http://example.com/foo
    body: ''
    headers: {}
  response:
    status:
      code: 200
      message: OK
    headers:
      Content-Length:
      - '10'
    body: Response 2
    http_version: '1.1'
  recorded_at: Tue, 01 Nov 2011 04:58:44 GMT
recorded_with: VCR 2.0.0
And
a file named "playback_repeats.rb" with:
include_http_adapter_for("net/http")

require 'vcr'

VCR.configure do |c|
  c.hook_into :fakeweb
  c.cassette_library_dir = 'cassettes'
end

puts "== With :allow_playback_repeats =="
VCR.use_cassette('example', :allow_playback_repeats => true) do
  puts response_body_for(:get, 'http://example.com/foo')
  puts response_body_for(:get, 'http://example.com/foo')
  puts response_body_for(:get, 'http://example.com/foo')
end

puts "\n== Without :allow_playback_repeats =="
VCR.use_cassette('example') do
  puts response_body_for(:get, 'http://example.com/foo')
  puts response_body_for(:get, 'http://example.com/foo')
  puts response_body_for(:get, 'http://example.com/foo')
end
When
I run ruby playback_repeats.rb
Then
it should fail with "Real HTTP connections are disabled"
And
the output should contain:
== With :allow_playback_repeats ==
Response 1
Response 2
Response 2

== Without :allow_playback_repeats ==
Response 1
Response 2

Last published over 2 years ago by myronmarston.