Usage With Cucumber

VCR can be used with cucumber in two basic ways:

  • Use VCR.use_cassette in a step definition.

  • Use a VCR.cucumber_tags block to tell VCR to use a cassette for a tagged scenario.

    In a cucumber support file (e.g. features/support/vcr.rb), put code like this:

    VCR.cucumber_tags do |t|
    t.tag  '@tag1'
    t.tags '@tag2', '@tag3'
    
    t.tag  '@tag3', :cassette => :options
    t.tags '@tag4', '@tag5', :cassette => :options
    t.tag  '@vcr', :use_scenario_name => true
    end

    VCR will use a cassette named cucumber_tags/<tag_name> for scenarios with each of these tags (Unless the :use_scenario_name option is provided. See below). The configured default_cassette_options will be used, or you can override specific options by passing a hash as the last argument to #tag or #tags.

    You can also have VCR name your cassettes automatically according to the feature and scenario name by providing :use_scenario_name => true to #tag or #tags. In this case, the cassette will be named <feature_name>/<scenario_name>. For scenario outlines, VCR will record one cassette per row, and the cassettes will be named <feature_name>/<scenario_name>/<row_name>.

Record HTTP interactions in a scenario by tagging it

Given a file named "lib/server.rb" with:

if ENV['WITH_SERVER'] == 'true'
  $server = start_sinatra_app do
    get('/:path') { "Hello #{params[:path]}" }
  end
end

Given a file named "features/support/vcr.rb" with:

And a file named "features/step_definitions/steps.rb" with:

And a file named "features/vcr_example.feature" with:

And the directory "features/cassettes" does not exist

When I run cucumber WITH_SERVER=true features/vcr_example.feature

Then it should fail with "5 scenarios (2 failed, 3 passed)"

And the file "features/cassettes/cucumber_tags/localhost_request.yml" should contain "Hello localhost_request_1"

And the file "features/cassettes/cucumber_tags/localhost_request.yml" should contain "Hello localhost_request_2"

And the file "features/cassettes/nested_cassette.yml" should contain "Hello nested_cassette"

And the file "features/cassettes/allowed.yml" should contain "Hello allowed"

And the file "features/cassettes/VCR_example/tagged_scenario.yml" should contain "Hello localhost_request_1"

And the file "features/cassettes/VCRexample/tagged_scenario_outline/_foo_bar.yml" should contain "Hello localhost_request_1"

When I run cucumber features/vcr_example.feature

Then it should fail with "5 scenarios (2 failed, 3 passed)"

And the output should contain each of the following:

| An HTTP request has been made that VCR does not know how to handle: | | GET http://localhost:7777/disallowed_1arrow-up-right | | An HTTP request has been made that VCR does not know how to handle: | | GET http://localhost:7777/disallowed_2arrow-up-right |

And the file "features/cassettes/cucumber_tags/localhost_request.yml" should contain "Hello localhost_request_1"

And the file "features/cassettes/cucumber_tags/localhost_request.yml" should contain "Hello localhost_request_2"

And the file "features/cassettes/nested_cassette.yml" should contain "Hello nested_cassette"

And the file "features/cassettes/allowed.yml" should contain "Hello allowed"

And the file "features/cassettes/VCR_example/tagged_scenario.yml" should contain "Hello localhost_request_1"

And the file "features/cassettes/VCRexample/tagged_scenario_outline/_foo_bar.yml" should contain "Hello localhost_request_1".

:allow_unused_http_interactions => false does not raise if the scenario already failed

Given a previously recorded cassette file "features/cassettes/cucumber_tags/example.yml" with:

And a file named "features/support/vcr.rb" with:

And a file named "features/step_definitions/steps.rb" with:

And a file named "features/vcr_example.feature" with:

When I run cucumber features/vcr_example.feature

Then it should fail with "1 scenario (1 failed)"

And the output should contain "boom"

And the output should not contain "There are unused HTTP interactions".

Last updated