I do a lot of work with external HTTP API’s, and I love the vcr for use in writing tests/specs involving these. It records the interaction, so most of the time the tests are running based on a recorded interaction, not actually going out to the remote HTTP server.
This makes the tests run faster, it makes more sense on a CI server like Travis, it let’s tests run automatically without having to hard-code credentials in for authenticated services (make sure to use VCR’s filter_sensitive_data feature, figuring out the a convenient way to do that with real world use cases is a different discussion), and it even lets people run the tests without having credentials themselves at all to make minor PRs and such.
But in actual local dev, I sometimes want to run my tests against live data for sure, often as the exactly HTTP requests change as I edit my code. Sometimes I need to do this over and over again in a cycle. Previously, I was doing things like manually deleting the relevant VCR cassettes files , to ensure I was running with live data, or avoid VCR “hey, this is a new request buddy” errors.
Why did I never think of using the tools VCR already gives us to make it a lot easier on myself?
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
VCR.configure do |c| | |
c.cassette_library_dir = 'spec/vcr_cassettes' | |
c.hook_into :webmock # or :fakeweb | |
c.configure_rspec_metadata! | |
# Let's you set default VCR mode with VCR=all for re-recording | |
# episodes. :once is VCR default | |
record_mode = ENV["VCR"] ? ENV["VCR"].to_sym : :once | |
c.default_cassette_options = { :record => record_mode } | |
end |
Normally works as always, but I just gotta VCR=all ./bin/rspec
to run that run with brand newly recorded cassettes. Or VCR=all ./bin/rspec some_specific_spec.rb
to re-record only that spec, or only the specs I’m working on, etc.
Geez, I should have figured that out years ago. So I’m sharing with you.
Just don’t ask me if it makes more sense to put VCR configuration in spec_helper.rb
or rails_helper.rb
. I still haven’t figured out what that split is supposed to be about honestly. I mean, I do sometimes VCR specs of service objects that do not have Rails dependencies…. but I usually just drop it (and all my other config) in rails_helper.rb
and ignore the fact that rspec these days is trying to force us to make a choice I don’t really understand the implications or utility of and don’t want to think about.
This is exactly what I was looking for! Thanks a bunch for posting. One thing I would do to clean it up a bit:
c.default_cassette_options = { record: ENV.fetch(“VCR”, ‘once’).to_sym }