23 Advanced vcr usage
Now that we’ve covered basic vcr
usage, it’s time for some more advanced usage topics.
23.1 Mocking writing to disk
If you have http requests for which you write the response to disk, then
use vcr_configure()
to set the write_disk_path
option. See more about
the write_disk_path configuration option.
Here, we create a temporary directory, then set the fixtures
tmpdir <- tempdir()
vcr_configure(
dir = file.path(tmpdir, "fixtures"),
write_disk_path = file.path(tmpdir, "files")
)
#> <vcr configuration>
#> Cassette Dir: /tmp/Rtmp5KYEUL/fixtures
#> Record: once
#> Serialize with: yaml
#> URI Parser: crul::url_parse
#> Match Requests on: method, uri
#> Preserve Bytes?: FALSE
#> Logging?: FALSE
#> ignored hosts:
#> ignore localhost?: FALSE
#> Write disk path: /tmp/Rtmp5KYEUL/files
Then pass a file path (that doesn’t exist yet) to crul’s disk
parameter.
vcr
will take care of handling writing the response to that file in
addition to the cassette.
library(crul)
## make a temp file
f <- tempfile(fileext = ".json")
## make a request
cas <- use_cassette("test_write_to_disk", {
out <- HttpClient$new("https://httpbin.org/get")$get(disk = f)
})
file.exists(out$content)
#> [1] TRUE
out$parse()
#> [1] "{\n \"args\": {}, \n \"headers\": {\n \"Accept\": \"application/json, text/xml, application/xml, */*\", \n \"Accept-Encoding\": \"gzip, deflate\", \n \"Host\": \"httpbin.org\", \n \"User-Agent\": \"libcurl/7.81.0 r-curl/5.2.2 crul/1.5.0\", \n \"X-Amzn-Trace-Id\": \"Root=1-66db2b2b-5e4edd395898432639dee8e9\"\n }, \n \"origin\": \"20.172.5.215\", \n \"url\": \"https://httpbin.org/get\"\n}\n"
This also works with httr
. The only difference is that you write to disk
with a function httr::write_disk(path)
rather than a parameter.
Writing to disk with httr2 does not yet work with vcr – see https://github.com/ropensci/vcr/issues/270
Note that when you write to disk when using vcr
, the cassette is slightly
changed. Instead of holding the http response body itself, the cassette
has the file path with the response body.
http_interactions:
- request:
method: get
uri: https://httpbin.org/get
response:
headers:
status: HTTP/1.1 200 OK
access-control-allow-credentials: 'true'
body:
encoding: UTF-8
file: yes
string: /private/var/folders/fc/n7g_vrvn0sx_st0p8lxb3ts40000gn/T/Rtmp5W4olr/files/file177e2e5d97ec.json
And the file has the response body that otherwise would have been in the string
yaml field above: