VCR throws a can not handle request on the second attempt to run the test (first attempts)

I have a VCR installed and it works on a few tests that I wrote with no problem. The most recent test I tried to record will pass on the first run, but will fail after that unless I remove the cassette. Test code:

it "doesn't blow up if a user doesn't have billing info" do
    VCR.use_cassette('tax_reconciler/no_method_error')do
      user_guid = rand(10000000)
      CreateRecurlyTestData.create_account(user_guid, nil, nil)
      tax_reconciler = TaxReconciler.new
      new_tax_amount = rand(100000)
      user = create_test_user(:guid => user_guid)
      expect(tax_reconciler.update_tax_amount(user, new_tax_amount)).to_not raise_error
    end
  end

      

The error message looks like this:

Error / Error: CreateRecurlyTestData.create_account (user_guid, nil, nil) VCRs :: Errors :: UnhandledHTTPRequestError:

   ================================================================================
   An HTTP request has been made that VCR does not know how to handle:
     GET https://2b64d08ef45c446dbba75720a37b7d41:@api.recurly.com/v2/accounts/3276643

   VCR is currently using the following cassette:
     - /Users/Evan/dish/stallone/fixtures/vcr_cassettes/tax_reconciler/no_method_error.yml
     - :record => :once
     - :match_requests_on => [:method, :uri]

   Under the current configuration VCR can not find a suitable HTTP interaction
   to replay and is prevented from recording new requests. There are a few ways
   you can deal with this:

     * If you're surprised VCR is raising this error
       and want insight about how VCR attempted to handle the request,
       you can use the debug_logger configuration option to log more details [1].
     * You can use the :new_episodes record mode to allow VCR to
       record this new request to the existing cassette [2].
     * If you want VCR to ignore this request (and others like it), you can
       set an `ignore_request` callback [3].
     * The current record mode (:once) does not allow new requests to be recorded
       to a previously recorded cassette. You can delete the cassette file and re-run
       your tests to allow the cassette to be recorded with this request [4].
     * The cassette contains 4 HTTP interactions that have not been
       played back. If your request is non-deterministic, you may need to
       change your :match_requests_on cassette option to be more lenient
       or use a custom request matcher to allow it to match [5].

   [1] https://www.relishapp.com/vcr/vcr/v/2-9-3/docs/configuration/debug-logging
   [2] https://www.relishapp.com/vcr/vcr/v/2-9-3/docs/record-modes/new-episodes
   [3] https://www.relishapp.com/vcr/vcr/v/2-9-3/docs/configuration/ignore-request
   [4] https://www.relishapp.com/vcr/vcr/v/2-9-3/docs/record-modes/once
   [5] https://www.relishapp.com/vcr/vcr/v/2-9-3/docs/request-matching

      

The only configuration options in the spec helper agent are:

VCR.configure do |c|
    c.cassette_library_dir = 'fixtures/vcr_cassettes'
    c.hook_into :webmock # or :fakeweb
  end

      

+3


source to share


1 answer


Your VCR setup is configured in Record Mode :once

: https://www.relishapp.com/vcr/vcr/v/1-8-0/docs/record-modes/once

In short, it only records requests when there is no tape. For subsequent runs, it will only read the written queries, so a query that does not match any of the written queries will raise this error.

One common way for things to go wrong with this mode is to remove your cassette and run just one show, not the whole package. Bingo - Your cassette has been created and all requests except one in this particular specification will be unrecognized.



The upside of this mode is that you can catch false requests - if you know that your cassette contains all valid requests, you can catch errors caused by bad requests using this mode.

If you want to be more flexible, you can use the recording mode new_episodes

. In this mode, recognized requests will be played back from the tape, and unrecognized requests will be executed and recorded.

+4


source







All Articles