我用rspec/capybara/vcr录磁带。当前,我的磁带将自动命名为包含正在运行的测试层次结构的简化版本,这是默认设置。
我想配置盒式磁带命名方案,使其依赖于请求的参数,因此任何带有xyz主体的put to/abc.com都将使用相同的磁带。我的想法是用这个配置录像机:

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.

如何用磁带的内容命名磁带并防止此错误?

最佳答案

我刚刚也遇到过同样的问题,根本原因似乎是磁带在某些请求(例如,在另一个块中使用VCR.use_cassette('whatever')时)中以某种方式嵌套。所以,我试着把一个VCR.use_cassette('whatever')放在eject_cassette之前,它看起来工作得很好,例如在这个例子中:

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

10-07 21:46