如何配置VCR以使用与请求匹配的磁带名称?

时间:2017-01-29 13:29:20

标签: ruby-on-rails ruby rspec capybara vcr

我正在使用rspec / capybara / VCR录制磁带。目前,我的磁带会自动命名为包含正在运行的测试层次结构的简化版本,默认情况下也是如此。

我想配置磁带命名方案,以便它依赖于请求的参数,因此任何带有XYZ主体的/ abc.com的PUT都将使用相同的磁带。我的想法是配置VCR:

config.around_http_request do |request|
  tape_name = Digest::SHA1.hexdigest [request.method, request.uri, request.headers.to_s, request.body.to_s].join('')
  puts "Using tape #{tape_name}"
  puts "on = #{VCR.turned_on?}"
  VCR.use_cassette(tape_name, :record => :new_episodes, &request)
end

但是当我这样做时,最终我得到的错误如下:

There is already a cassette with the same name (5d971f35322c4e0cf7d379aa39a28ef12994552f).  You cannot nest multiple cassettes with the same name.

如何使用其中包含的内容命名磁带并防止出现此错误?

1 个答案:

答案 0 :(得分:0)

我刚刚遇到了同样的问题,看来根本原因是在某些请求期间盒式磁带以某种方式嵌套(例如,在另一个VCR.use_cassette('whatever')块中使用VCR.use_cassette('whatever'))。因此,我尝试将eject_cassette放在use_cassette之前,它似乎可以正常工作,例如在这种情况下:

VCR.eject_cassette(tape_name)
VCR.use_cassette(tape_name, :record => :new_episodes, &request)