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

时间:2014-02-14 12:58:11

标签: rspec stub vcr

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

1 个答案:

答案 0 :(得分:6)

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

根据this Google Groups thread

  

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