Ruby on rails Rspec+;萨沃恩+;录像机不录音

Ruby on rails Rspec+;萨沃恩+;录像机不录音,ruby-on-rails,rspec,savon,vcr,Ruby On Rails,Rspec,Savon,Vcr,我不能用vcr录制任何东西,我有这样的设置: spec_helper.rb require 'vcr' VCR.configure do |c| c.cassette_library_dir = 'spec/cassettes' c.hook_into :webmock c.configure_rspec_metadata! c.default_cassette_options = { :record => :new_episodes } end 和测试: describ

我不能用vcr录制任何东西,我有这样的设置:

spec_helper.rb

require 'vcr'
VCR.configure do |c|
  c.cassette_library_dir = 'spec/cassettes'
  c.hook_into :webmock
  c.configure_rspec_metadata!
  c.default_cassette_options = { :record => :new_episodes }
end
和测试:

describe SomeClass do
  describe '#foo', vcr: true do
    it 'should do http request', do
      expect(subject.do_request).to be_true
    end
  end
end
运行该规范会导致:

.HTTPI executes HTTP GET using the net_http adapter
SOAP request: (...)

就像没有录像机一样。不幸的是,里面什么都没有。我发现报告了类似的问题,但要求
httpi
没有任何效果。应该怎么做才能让它工作?

为了让VCR记录正确匹配的SOAP请求,我指定了更多的匹配器供其使用。由于使用SOAP,url端点通常相同,但每个请求的主体内容/标题不同。注意,:方法,:uri,:头。你们也可以让它在正文中匹配,但这对于我的用例来说已经足够了,因为我们的标题对于每个请求都非常详细。我用这个:

VCR.configure do |c|
  c.hook_into :webmock # fakeweb fails with savon
  c.ignore_hosts 'www.some-url.com'
  c.configure_rspec_metadata!
  c.ignore_localhost                        = true
  c.cassette_library_dir                    = 'spec/support/vcr_cassettes'
  c.allow_http_connections_when_no_cassette = true
  c.default_cassette_options                = { allow_playback_repeats: true, match_requests_on: [:method, :uri, :headers] }
  # c.debug_logger                            = File.open(Rails.root.join('log/vcr.log'), 'w')
end
然后,我用一个空散列标记规范,以防覆盖全局VCR配置,如:

describe SomeClass do
  describe '#foo', vcr: {} do
    # test something
  end
end

最后,VCR/Webmock忽略的请求越多,调试就越容易。因此,如果您有很多JS调用或类似调用,请将这些请求添加到“忽略主机”选项中。我在全局配置中的最后一行显示了如何让VCR记录它正在做的事情,这也很有帮助。

为什么这是一个Savon问题?值得一提的是,您应该仔细检查您的磁带记录到哪里。VCR文档建议
c.caxed_library_dir='fixtures/VCR_casteds'
我被难住了,为什么我的Savon卡带没有被记录在'test/fixtures/VCR_casteds'中。来看看
CASEX\u library\u dir
路径来自
Rails.root
目录,它们应该被记录在那里。同样,对于未来的谷歌用户:FakeWeb(从版本开始)