I'm trying to mock a api call in which I upload a file, I'm using Wistia Upload API and because I don't want to hit the server with every test, I'm trying VCR for the first time.
I have the following test in my spec/controllers folder:
let(:file) { Rack::Test::UploadedFile.new("video_path", 'video/mp4') }
describe "GET #index" do
it "assigns all videos as @videos" do
VCR.use_cassette "wistia/upload" do
video = Video.create! valid_attributes
get :index, {}
expect(assigns(:videos)).to eq([video])
end
end
end
end
The API call is triggered inside a model callback that looks like this:
class Video < ActiveRecord::Base
after_save :move_video
def move_video
uri = URI('https://upload.wistia.com/')
http = Net::HTTP.new(uri.host, uri.port)
http.use_ssl = true
# Construct the request.
request = Net::HTTP::Post::Multipart.new uri.request_uri, {
'api_password' => '',
'project_id' => ''
'file' => my_video_file
}
# Make it so!
response = http.request(request)
return response
end
end
I've debugged the call to this method, and it's being called properly, but when I run my test I'm getting the following error:
1) VideosController GET #index assigns all videos as @videos
Failure/Error: video = Video.create! valid_attributes
VCR::Errors::UnhandledHTTPRequestError:
================================================================================
An HTTP request has been made that VCR does not know how to handle:
POST https://upload.wistia.com/
VCR is currently using the following cassette:
- /Users/urielhernandez/Documents/pf/spec/vcr/wistia/upload.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 an HTTP interaction that matches this request,
but it has already been played back. If you wish to allow a single HTTP
interaction to be played back multiple times, set the `:allow_playback_repeats`
cassette option [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/playback-repeats
================================================================================
The cassette was created but I was receiving the mentioned error. After I deleted the cassette to see if it was being generated, it was no re generated, and VCR is not handling the request.
The cassette is being created at /Users/urielhernandez/Documents/pf/spec/vcr/wistia/upload.yml
as described in the error message.
Try VCR.use_cassette("wistia/upload", :record => :new_episodes) do
; that will record this as a new request in the same cassette.
See more about vcr record modes at https://www.relishapp.com/vcr/vcr/v/1-3-2/docs/record-modes
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With