我正在使用带有RSpec的VCR对一段API代码进行单元测试,我遇到了一个小小的挑战。
我的客户端代码使用sleep
来限制API请求。感谢this elegant solution,我现在可以使用单元测试中的存根截取sleep
消息:
expect(subject).to receive(:sleep)
问题在于,虽然我正在开发此代码,但我必须经常删除我的磁带,但由于我已经存根sleep
,因此对实际API请求和规范打击没有速率限制起来。
我想做的事情如下:
expect(subject).to receive(:sleep) if !vcr.real_request?
当我录制录音带时,我不会干扰主题sleep
。
我看到有趣的related discussion,但它似乎是一个不同的情况,我不知道如何直接利用它。但是,这确实让我发现了VCR挂钩(特别是before_playback
)但是我不清楚如何将subject
导出到块的范围内,或者将代理块执行导入到范围内我的测试来制作存根。
有什么想法吗?
注意:我正在使用config.configure_rspec_metadata!
中的spec_helper.rb
功能自动捕获/命名我的磁带,如果这有任何区别(即我没有明确地将每个单独的API方法包装在其中自己的VCR区块。)
答案 0 :(得分:6)
事实证明,这是可能的,没有任何诡计。
您可以使用
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
由于current_cassette.recording?
是公开可访问的,因此它完全符合我的需要,而且没有任何黑客行为:
expect(subject).to receive(:sleep) if !VCR.current_cassette.recording?