在一次测试中使用多个带有VCR的盒式磁带



我正在使用VCR来记录与外部API的http交互。这是我的(工作(代码:

it 'does xyz....' do
hook_payload = {ruby_hash: 'here'}
VCR.use_cassette('my_folder/create_project') do
VCR.use_cassette('my_folder/get_project') do
update = Update.new(hook_payload)
expect { update.call }.to change { Projects.count }.by(1)
end
end
end

上面的代码有效,但组织不好,因为我更喜欢在块外进行expect{}调用。所以,我试了这个,但以下代码不起作用:

context 'my context', vcr: { group: 'my_folder', cassettes: %w[create_project get_project] } do
it 'does xyz....' do
hook_payload = {ruby_hash: 'here'}
update = Update.new(hook_payload)
expect { update.call }.to change { Projects.count }.by(1)
end

但是此代码不起作用,我收到以下错误:

VCR is currently using the following cassette: - /Users/me/this_project/spec/fixtures/vcr/my_folder/create_project.yml.

Under the current configuration VCR can not find a suitable HTTP interaction to replay and is prevented from recording new requests.

我 100% 确定my_folder/get_project.yml是有效的,并且可以在项目中的其他测试中使用。

我甚至将盒式磁带(%w[create_project get_project](放在与代码中使用的顺序相同的顺序。我在这里做错了什么?

建议使用该块,但如果您不想这样做,也有选择。有两种方法:使用周围钩或前后钩

。如果您手动加载盒式磁带,如果您在测试之间重复使用盒式磁带,则需要弹出它们,因为它们不喜欢被加载两次(VCR 类比在这里很适用!

https://www.rubydoc.info/github/vcr/vcr/VCR:insert_cassette

尝试使用不需要块的VCR.insert_cassette。您需要在拆解中致电eject_cassette。我试过了,它奏效了。排序无关紧要。

it 'does xyz....' do
hook_payload = {ruby_hash: 'here'}
VCR.insert_cassette('my_folder/create_project')
VCR.insert_cassette('my_folder/get_project')

update = Update.new(hook_payload)

expect { update.call }.to change { Projects.count }.by(1)
end

调用弹出以避免两次加载盒式磁带:


VCR.eject_cassette(name: 'my_folder/create_project')
VCR.eject_cassette(name: 'my_folder/get_project')

周围的钩子也可能适合你:

around do |example|
cassettes = [
{ name: 'my_folder/create_project' },
{ name: 'my_folder/get_project' }
]
VCR.use_cassettes cassettes do
example.run
end
end

您甚至可以将其与盒式磁带配置结合使用:

it 'whateva', vcr: { cassette_name: 'load another' } do
end

最新更新