RSpec: automatic creation of VCR cassettes

Updated . Posted . Visible to the public. Repeats.

This RailsCast Show archive.org snapshot demonstrated a very convenient method to activate VCR for a spec by simply tagging it with :vcr.

For RSpec3 the code looks almost the same with a few minor changes. If you have the vcr and webmock gems installed, simply include:

# spec/support/vcr.rb
VCR.configure do |c|
  c.cassette_library_dir = Rails.root.join("spec", "vcr")
  c.hook_into :webmock
end

RSpec.configure do |c|
  c.around(:each, :vcr) do |example|
    name = example.metadata[:full_description].split(/\s+/, 2).join("/").underscore.gsub(/[^\w\/]+/, "_")
    options = example.metadata.slice(:record, :match_requests_on).except(:example_group)
    VCR.use_cassette(name, options) { example.call }
  end
end

Behaviour

  • If a spec is not tagged with :vcr, VCR will complain about any attempted HTTP request. This is the default behaviour. If you want to turn this off temporarily, e.g. to communicate with an actual API while writing a new spec, simply add the line c.allow_http_connections_when_no_cassette = true to the VCR.configure-block.

  • If a spec is tagged with :vcr, a cassette with an automatically determined name will be generated on the first test run and replayed on subsequent runs:

Spec:

# spec/models/<model_name>/<file_name>_spec.rb
describe ModelName::ExampleApi do

  describe '<describe_title>' do
    it '<it_title>', :vcr do
      # calls to API
      # expectations
    end
  end
  
end

Generated Cassette:

spec/vcr/
  <model_name>/
    <file_name>_<describe_title>/
      <it_title>.yml
Klaus Weidinger
Last edit
Michael Leimstädtner
License
Source code in this card is licensed under the MIT License.
Posted by Klaus Weidinger to makandra dev (2021-10-11 11:50)