Ruby 在类似场景中回收已录制的vcr磁带,或告诉vcr在特定场景中使用特定磁带

Ruby 在类似场景中回收已录制的vcr磁带,或告诉vcr在特定场景中使用特定磁带,ruby,cucumber,vcr,Ruby,Cucumber,Vcr,我必须用一些新的场景来扩展现有的cucumber特性,包括一些新的行为。目前,整个cucumber/vcr装置已设置为可以查找具有匹配场景名称的磁带: feature bar @vcr scenario foo 将在/casteds/bar/foo.yml中查找录制的磁带。但是,还有更多的情况可能会回收录制前的磁带。(我这边也要补充)。因此,对于每个场景,都有一个文件夹膨胀,其中包含相同的磁带,但仅重命名为: feature bar @vcr scenario foo

我必须用一些新的场景来扩展现有的cucumber特性,包括一些新的行为。目前,整个cucumber/vcr装置已设置为可以查找具有匹配场景名称的磁带:

feature bar

  @vcr
  scenario foo
将在
/casteds/bar/foo.yml
中查找录制的磁带。但是,还有更多的情况可能会回收录制前的磁带。(我这边也要补充)。因此,对于每个场景,都有一个文件夹膨胀,其中包含相同的磁带,但仅重命名为:

feature bar

  @vcr
  scenario foo

  @vcr
  scenario foo1

  ...

  @vcr
  scenario fooX
因此,我们是
/casteds/bar/foo.yml
/casteds/bar/foo1.yml
/casteds/bar/fooX.yml
具有完全相同的内容。什么是正确的干燥方法

是否有可能明确指定要使用的vcr磁带,例如

  @vcr(:cassette => foo)
  scenario fooX

非常感谢;)

我通过为VCR定义一个新标签解决了这个问题:

#./test_helper/vcr.rb
VCR.cucumber_tags do |t|
  t.tag '@vcr', use_scenario_name: true
  t.tag '@foo'
end
然后我加了一个前后挂钩,用来装我想要的录音带:

# ./features/support/env.rb
Before('@foo') do
  VCR.insert_cassette('cassettes/bar/foo')
end

After('@foo') do
  VCR.eject_cassette
end
因此,现在我只需要为类似场景注释新定义的标记:

feature bar

  @foo
  scenario foo

  @foo
  scenario foo1

  ...

  @foo
  scenario fooX

所以现在我只剩下一个录音带文件了

VCR.cucumber_tags{t|t.tag'@foo'}
为您设置
之前
/
之后的挂钩。这就是它所做的,以及它存在的原因,所以没有必要自己设置钩子。或者,如果你想自己做这件事,那很好——但我会删除
标记@foo
声明,因为它什么也没做。对不起,我有点困惑,我现在完全按照你的建议做了,如果我想使用一个特定的casette,我应该在hook中指定它,所以我就这么做了。如果你想使用一个特定的casette,你不想让它根据cumber标签自动命名,那么是的:你需要使用钩子,自己动手。但是在这种情况下,不需要声明
t.tag'@foo'
,因为您正在手动执行
t.tag
通常为您执行的操作。OTOH,如果您不想指定完整的磁带名称,只想在多个场景中重复使用磁带,并且乐意让VCR根据标签名称将其组织到cucumber_标签目录中,那么您可以使用
t.tag
w/o自行声明挂钩。