如何判断录像机是处于录制还是播放模式?

Chr*_*son 1 rspec stub vcr

我正在使用带有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块中).

Chr*_*son 7

事实证明,这是可能的,没有任何诡计.

根据此Google网上论坛主题:

您可以使用 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)

  • 我正在使用 VCR 2.9.3 和 VCR::Cassette.recording?仅当 record_mode 为 :once 时才真正有效。 (2认同)