8

如何告诉 VCR 我希望它完全忽略规范文件?

我在 Google Groups 上读过一篇文章,其中建议要么允许真正的 HTTP 请求,要么明确关闭 VCR。

在我看来,更有用的是 VCR 不会坚持下去,除非规范具有:vcr元数据标签。我不想在before/中关闭并重新打开 VCR after,因为我不知道它是否事先打开。我不想在所有规范中都允许真正的 HTTP 请求,只允许一些特定的请求。

有什么办法可以让 VCR 更有选择性吗?

4

5 回答 5

10

这不是最优雅的解决方案,但您可以使用实例变量将配置恢复为原始设置

describe "A group of specs where you want to allow http requests" do
  before do
    VCR.configure do |c|
      @previous_allow_http_connections = c.allow_http_connections_when_no_cassette?
      c.allow_http_connections_when_no_cassette = true
    end
  end

  after do
    VCR.configure do |c|
      c.allow_http_connections_when_no_cassette = @previous_allow_http_connections
    end
  end

  # Specs in this block will now allow http requests to be made

end

我发现这对我最初启动并运行 API 并希望能够调试我正在发出的请求很有帮助。一旦我的 API 正常工作,我就可以删除之前和之后的块,并像往常一样使用 VCR。

于 2016-05-02T18:56:29.380 回答
8

当然,在您的配置块中添加:

VCR.configure do |c|
  c.allow_http_connections_when_no_cassette = true
end

这是 AFAIK 关于您的测试套件的唯一选项 VCR。请参阅文档

尽管您很可能确实应该考虑此类行为的记录模式,因此它是可行的。

于 2015-06-08T11:38:16.730 回答
2

有一些方法可以让你做到这一点,这里有一些资源:

这些方面的东西可能会起作用:

# In the beginning of your describe block
around do |example|
  VCR.turned_off { example.run }
end

或者

let(:request) { 
  VCR.turned_off do
    get some_path(params)
  end
end

it { expect { request } .to .... }

VCR.eject_cassette根据您在规范中的操作,您可能需要在使用关闭方法之前使用。

于 2020-11-25T05:57:48.203 回答
1

根据凯西的回答,我想出了这个帮助模块:

module VcrHelpers
  def self.perform_without_cassette
    VCR.configure { |c| c.allow_http_connections_when_no_cassette = true }
    yield
  ensure
    VCR.configure { |c| c.allow_http_connections_when_no_cassette = false }
  end
end

然后可以从这样的任何规范中调用它:

VcrHelpers.perform_without_cassette do
 some_http_request
end
于 2020-07-08T11:11:52.950 回答
1

在我的情况下,我不想允许非 VCR 规范的真正 HTTP 连接,我只想为这些规范禁用 VCR,以便 Webmock 直接处理它们。这对我有用:

RSpec.configure do |config|
  config.around do |example|
    if example.metadata.key?(:vcr)
      example.run
    else
      VCR.turned_off { example.run }
    end
  end
end
于 2020-11-20T15:13:33.223 回答