您好我正在尝试使用带标签的vcr测试google auth黄瓜。
一切正常,直到令牌过期。我认为当它到期时会发生这种情况
但我有一个包含此内容的文件
http_interactions:
- request:
method: post
uri: https://accounts.google.com/o/oauth2/token
body:
如果我允许录像机录制新请求,则此录像带的内容会发生变化。我不明白为什么,如果方法和uri没有将POST更改为https://accounts.google.com/o/oauth2/token。
我更改了标签以录制新剧集,现在测试正在通过......我无能为力。
我再次运行测试,现在我在POST到令牌网址时正在执行此操作:
Completed 500 Internal Server Error in 449ms
Psych::BadAlias (Unknown alias: 70317249293120):
答案 0 :(得分:2)
好的,这是一个解决方案...... 正如我在评论中所说,问题来自刷新令牌。使用oauth时,您有一个令牌,可能已过期(或未过期)。如果您运行测试且令牌是新鲜的,则不会调用该请求。但是如果令牌已过期,则必须刷新它,因此vcr会抛出错误。 为了解决这个问题,我所做的是将刷新令牌url添加到vcr:
的忽略请求中VCR.configure do |c|
c.cassette_library_dir = 'fixtures/vcr_cassettes'
c.hook_into :webmock # or :fakeweb
c.ignore_request {|request| request.uri == 'https://accounts.google.com/o/oauth2/token' }
end
这不是最佳解决方案,因为有时令牌会在测试中刷新......但它是我能找到的最佳解决方案......
答案 1 :(得分:1)
也许你在帖子里面有一些参数,每个请求都有不同的参数?如果是这样,您可以通过将match_requests_on: [:method, VCR.request_matchers.uri_without_params("your_param")]
添加到VCR配置来告诉VCR忽略此参数。
深入分析您的请求,并找出哪些参数正在发生变化。您也可以告诉VCR在其他标准上匹配,请查看https://www.relishapp.com/vcr/vcr/v/2-4-0/docs/request-matching
答案 2 :(得分:0)
我在同一个网址上遇到了同样的问题。对我来说,问题是我的代码试图不止一次地对https://accounts.google.com/o/oauth2/token
进行相同的调用。
VCR错误消息中给出的潜在解决方案之一告诉您解决方案:
磁带包含与此请求匹配的HTTP交互,但它已被播放。如果您希望允许多次播放单个HTTP交互,请设置
:allow_playback_repeats
磁带选项
在我的情况下,添加此选项可以解决问题,因为它告诉VCR恢复其1.x功能,即不重新记录重复请求,而只是回放先前记录的重复请求的结果。
我正在使用Cucumber,所以我的解决方案是将以下内容添加到features/support/vcr.rb
:
VCR.cucumber_tags do |t|
t.tag '@vcr', use_scenario_name: true
t.tag '@new_episodes', record: :new_episodes
t.tag '@allow_playback_repeats', use_scenario_name: true, allow_playback_repeats: true, record: :new_episodes
end
注意@allow_playback_repeats
标记。我只是用这个标签标记了我的场景,之后一切正常:
@allow_playback_repeats
Scenario: Uploading a video initiates an upload to YouTube
请注意,如果同时指定@vcr
和@allow_playback_repeats
,则无效。
如果您正在使用RSpec,则需要相应地调整解决方案,但是,should be as simple as:
it "does something", :vcr => { allow_playback_repeats: true } do
...
end