我正在使用带有RSpec的VCR对一段API代码进行单元测试,我遇到了一个小小的挑战.
我的客户端代码用于sleep对API请求进行速率限制.感谢这个优雅的解决方案,我现在可以sleep使用单元测试中的存根拦截消息:
expect(subject).to receive(:sleep)
Run Code Online (Sandbox Code Playgroud)
问题是,当我开发这个代码时,我必须经常删除我的磁带,但是因为我已经存根sleep,所以对真正的API请求没有速率限制并且规范爆炸了.
我认为我想做的是以下内容:
expect(subject).to receive(:sleep) if !vcr.real_request?
Run Code Online (Sandbox Code Playgroud)
因此,sleep当我录制磁带时,我不会干扰主题.
我看到有趣的相关讨论,但它似乎是一个不同的情况,我不知道如何直接利用它.但是,这确实让我发现了VCR挂钩(特别是before_playback),但我不清楚如何导出subject到块的范围内,或者代理块执行到我的测试范围内来制作存根.
有什么想法吗?
注意:我正在使用我的config.configure_rspec_metadata!功能spec_helper.rb自动捕获/命名我的磁带,如果这有任何区别(即我没有明确地将每个单独的API方法包装在它自己的VCR块中).
事实证明,这是可能的,没有任何诡计.
您可以使用
VCR.http_stubbing_adapter.http_connections_allowed?
但是(正如作者所解释的)这种方法没有公开记录,并且(正如作者准确预测的那样)在2.x代码行中不可用.然而,这确实让我直接从好奇和绝望的混合物中检查VCR源.我在lib/vcr.rb中找到了以下内容:294:
def real_http_connections_allowed?
return current_cassette.recording? if current_cassette
!!(configuration.allow_http_connections_when_no_cassette? || @turned_off)
end
Run Code Online (Sandbox Code Playgroud)
既然current_cassette.recording?可以公开访问,它完全符合我的需要而不会有任何黑客攻击:
expect(subject).to receive(:sleep) if !VCR.current_cassette.recording?
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
960 次 |
| 最近记录: |