Eri*_*k J 12 ruby rspec ruby-on-rails cucumber vcr
在我的黄瓜支持目录中,我在vcr.rb中有以下内容:
require 'vcr'
VCR.configure do |c|
c.cassette_library_dir = 'fixtures/vcr_cassettes'
c.hook_into :webmock
c.ignore_localhost = true
c.default_cassette_options = { record: :new_episodes }
end
Run Code Online (Sandbox Code Playgroud)
我正在对城市名称进行地理编码,从而调用Google Maps API.我正在尝试记录和存根这些请求,但它会将相同的请求记录到同一个yml文件中:
- request:
method: get
uri: http://maps.googleapis.com/maps/api/geocode/json?address=Miami,%20FL&language=en&sensor=false
body:
encoding: US-ASCII
string: ''
headers:
Accept-Encoding:
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept:
- ! '*/*'
User-Agent:
- Ruby
# response...
- request:
method: get
uri: http://maps.googleapis.com/maps/api/geocode/json?address=Miami,%20FL&language=en&sensor=false
body:
encoding: US-ASCII
string: ''
headers:
Accept-Encoding:
- gzip;q=1.0,deflate;q=0.6,identity;q=0.3
Accept:
- ! '*/*'
User-Agent:
- Ruby
Run Code Online (Sandbox Code Playgroud)
它是相同的URL和非常相同的请求,不应该VCR存根请求?每当我尝试搜索同一个城市时,如何防止我的规范访问API?
Myr*_*ton 21
很难确定你发布的内容是什么,但我可以更多地解释一下VCR如何工作并对这种行为的可能原因做出一些猜测.
VCR使用请求匹配器尝试查找以前记录的HTTP交互以进行回放.在单个磁带盒会话期间,当播放HTTP交互时,它被认为是"已使用"并且不会再次播放(除非您使用allow_playback_repeats选项).
所以...这里有几个可能的想法:
:allow_playback_repeats(这是默认设置,以及我建议您如何使用VCR),那么如果您的测试中出现多个重复请求,您可能会发生您所看到的行为 - 例如,盒式磁带可能只有一个匹配请求,但你正在测试它们中的两个 - 这将播放一个并记录一个(因为你正在使用:new_episodes).要解决这个问题,我建议您使用debug_logger选项让VCR打印它正在做的事情以及它如何匹配每个请求.这应该可以让您深入了解正在发生的事情.您还可以覆盖任何内置请求匹配器,并在匹配器中提供您自己的逻辑和/或设置断点:
VCR.configure do |c|
c.register_request_matcher :uri do |request_1, request_2|
debugger # so you can inspect the requests here
request_1.uri == request_2.uri
end
end
Run Code Online (Sandbox Code Playgroud)
您可能还遇到了VCR错误,虽然比较URI(使用String#==)是一个基本操作,我很难想象那里的错误.如果您无法解决问题,请随意打开github问题(希望调试记录器输出和/或触发此问题的代码示例).
另外,我建议你使用:once记录模式(默认)而不是:new_episodes. :once永远不会记录与现有磁带相关的额外HTTP交互 - 它只允许录制一次磁带.如果请求无法匹配,则会引发错误,提醒您无法匹配的事实. :new_episodes另一方面,它会记录任何无法找到匹配项的请求,这就是您所看到的行为.
当我遇到类似的问题时,我通过使match_requests_on设置更具体来修复它:
VCR.configure do |c|
c.default_cassette_options = {
match_requests_on: [:uri, :body, :method]
}
end
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
5492 次 |
| 最近记录: |