Implementing RSpec Metadata Integration for VCR Cassette Management in vcr
This test suite implements RSpec integration with VCR, providing automated cassette management for HTTP interaction recording and playback in Ruby tests. It handles metadata-driven cassette naming and configuration for seamless VCR integration with RSpec test blocks.
Test Coverage Overview
Implementation Analysis
Technical Details
Best Practices Demonstrated
vcr/vcr
lib/vcr/test_frameworks/rspec.rb
module VCR
# Integrates VCR with RSpec.
module RSpec
# @private
module Metadata
extend self
def vcr_cassette_name_for(metadata)
description =
if metadata[:description].empty?
# we have an "it { is_expected.to be something }" block
metadata[:scoped_id]
else
metadata[:description]
end
example_group =
if metadata.key?(:example_group)
metadata[:example_group]
else
metadata[:parent_example_group]
end
if example_group
[vcr_cassette_name_for(example_group), description].join('/')
else
description
end
end
def configure!
::RSpec.configure do |config|
when_tagged_with_vcr = { :vcr => lambda { |v| !!v } }
config.before(:each, when_tagged_with_vcr) do |ex|
example = ex.respond_to?(:metadata) ? ex : ex.example
cassette_name = nil
options = example.metadata[:vcr]
options = case options
when Hash #=> vcr: { cassette_name: 'foo' }
options.dup
when String #=> vcr: 'bar'
cassette_name = options.dup
{}
else #=> :vcr or vcr: true
{}
end
cassette_name ||= options.delete(:cassette_name) ||
VCR::RSpec::Metadata.vcr_cassette_name_for(example.metadata)
VCR.insert_cassette(cassette_name, options)
end
config.after(:each, when_tagged_with_vcr) do |ex|
example = ex.respond_to?(:metadata) ? ex : ex.example
VCR.eject_cassette(:skip_no_unused_interactions_assertion => !!example.exception)
end
end
end
end
end
end