关闭特定规格的VCR

时间:2015-06-08 11:27:53

标签: ruby rspec vcr

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

我已阅读post on Google Groups,建议允许真正的HTTP请求,或明确关闭VCR。

在我看来,除非规范具有:vcr元数据标签,否则VCR不会嗤之以鼻。我不想在before / after中关闭VCR并重新打开,因为我事先并不知道它是否已开启。我不想在所有规范中允许真正的HTTP请求,只是某些特定的规范。

有没有办法让VCR更具选择性?

5 个答案:

答案 0 :(得分:5)

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

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

这是AFAIK VCR对您的测试套件的唯一选择。请参阅docs

最有可能你应该考虑record modes这样的行为,以便它可行。

答案 1 :(得分:4)

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

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。

答案 2 :(得分:0)

根据Casey的回答,我想到了这个帮助器模块:

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

答案 3 :(得分:0)

在我的情况下,我不想为非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

答案 4 :(得分:0)

有一些方法可以让您执行此操作,以下是一些资源:

遵循这些思路可能会起作用:

# 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,然后再使用关闭方法。