【问题标题】:How to tell if VCR is in record or playback mode?如何判断 VCR 是处于录制模式还是播放模式?
【发布时间】:2014-02-14 12:58:11
【问题描述】:

我正在使用 VCR 和 RSpec 对一段 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 导出到块的范围内,或者代理块执行到我的测试范围内存根。

有什么想法吗?

注意:我正在使用我的 spec_helper.rb 中的 config.configure_rspec_metadata! 功能来自动捕获/命名我的磁带,如果这有什么不同的话(即我没有将每个单独的 API 方法明确地包装在它自己的 VCR 块中) .

【问题讨论】:

    标签: rspec stub vcr


    【解决方案1】:

    事实证明,这是可能的,无需任何技巧。

    根据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?
    

    【讨论】:

    • 我正在使用 VCR 2.9.3 和 VCR::Cassette.recording?仅当 record_mode 为 :once 时才真正有效。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-11-29
    • 2010-10-13
    • 1970-01-01
    • 2011-01-22
    • 2019-09-08
    • 1970-01-01
    • 2021-12-11
    相关资源
    最近更新 更多