我正在使用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