vcr不知道如何处理这个请求

时间:2013-02-14 22:53:10

标签: ruby-on-rails cucumber google-oauth vcr

您好我正在尝试使用带标签的vcr测试google auth黄瓜。

一切正常,直到令牌过期。我认为当它到期时会发生这种情况

enter image description here

但我有一个包含此内容的文件

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):

3 个答案:

答案 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