module VCR::RSpec::Metadata
def configure!
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
def vcr_cassette_name_for(metadata)
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