ruby 针对特定规格关闭VCR

w6mmgewl  于 2022-12-18  发布在  Ruby
关注(0)|答案(5)|浏览(99)

我怎样告诉VCR我想让它完全忽略一个规格文件?
我在Google群组上读到过一篇文章,建议要么允许真实的的HTTP请求,要么明确关闭VCR。
在我看来,更有用的是VCR不要插手,除非一个规范有:vcr元数据标签。我不想在before/after中关闭VCR并再次打开,因为我不知道它是否事先打开过。我不想允许所有规范都有真实的的HTTP请求,只是一些特定的规范。
有没有办法让录像机更有选择性?

093gszye

093gszye1#

这不是最好的解决方案,但是您可以使用示例变量将配置返回到其原始设置

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正常工作,我就可以删除before和after块,并正常使用VCR。

dy2hfwbg

dy2hfwbg2#

当然,在配置块中添加:

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

这是VCR关于测试套件的唯一选项AFAIK。请参阅docs
最有可能的是,你真的应该考虑record modes的行为,这样它是可行的。

toiithl6

toiithl63#

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

沿着几点可能会奏效:

# 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 .... }

在使用turn off方法之前,可能需要先使用VCR.eject_cassette,具体取决于在规范中执行的操作。

n3h0vuf2

n3h0vuf24#

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

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

有关测试中的包含/要求,请参见docs

lymnna71

lymnna715#

在我的例子中,我不想让真实的的HTTP连接用于非VCR规范,我只想让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

相关问题