4

嗨,我正在尝试使用带有标签的 vcr 用黄瓜测试谷歌身份验证。

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

在此处输入图像描述

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

http_interactions:
- request:
  method: post
  uri: https://accounts.google.com/o/oauth2/token
  body:

如果我允许 vcr 录制新请求,则此磁带的内容会更改。我不明白为什么,如果方法和 uri 没有将 POST 更改为https://accounts.google.com/o/oauth2/token

我更改了标签以录制新剧集,现在测试通过了……我一无所知。

我再次运行测试,现在当 POST 到令牌 url 完成时我有了这个:

Completed 500 Internal Server Error in 449ms

Psych::BadAlias (Unknown alias: 70317249293120):
4

3 回答 3

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

这不是最好的解决方案,因为有时令牌会在测试中刷新......但这是我能找到的最好的解决方案......

于 2014-03-14T15:46:23.017 回答
2

也许您在帖子中有一些参数,每个请求都不同?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

于 2013-04-30T08:44:52.023 回答
1

我在相同的 URL 上遇到了同样的问题。对我来说,问题是我的代码试图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,则需要相应地调整解决方案,但是,它应该很简单

it "does something", :vcr => { allow_playback_repeats: true } do
   ...
end
于 2015-04-24T20:53:17.633 回答