3

我有一个非常简单的控制器,它使用 Feedjira 从 rss 中获取一些数据。我想通过记录 RSS 响应来测试这个控制器。这是控制器代码:

  def index
    @news = Feedjira::Feed.fetch_and_parse URI.encode("http://news.google.com/news/feeds?q=\"#{query}\"&output=rss")
  end

和我的规格测试:

it "should assign news feed", :vcr do
  get :index
  assigns(:news).entries.size.should == 6
  assigns(:news).entries[0].title.should == "First item title"
end

和 vcd 配置的代码:

VCR.configure do |c|
  c.cassette_library_dir = Rails.root.join("spec", "vcr")
  c.hook_into :fakeweb
  c.ignore_localhost = true
end

RSpec.configure do |c|
  c.treat_symbols_as_metadata_keys_with_true_values = true
  c.around(:each, :vcr) do |example|
    name = example.metadata[:full_description].split(/\s+/, 2).join("/").underscore.gsub(/[^\w\/]+/, "_")
    options = example.metadata.slice(:record, :match_requests_on).except(:example_group)
    VCR.use_cassette(name, options) { example.call }
  end
end

由于某些未知原因,此特定测试中未记录 VCR 盒式磁带。所有其他使用网络调用的测试都可以正常工作,但是在使用 Feedjira 的测试中,vcr 似乎没有检测到网络调用。为什么?

4

2 回答 2

0

根据Feedjira 的主页,它使用了遏制,而不是Net::HTTP发出 HTTP 请求:

Feedjira 的一个重要目标是速度——通过使用 libcurl-multi 来快速获取速度。

VCR 只能使用 FakeWeb 来挂钩Net::HTTP请求。要连接到遏制请求,您需要改为使用hook_into :webmock

于 2014-09-09T06:03:10.323 回答
0

截至 Feedjira 2.0 中的此提交,Feedjira 使用法拉第,这意味着您可以遵循法拉第自述文件中的测试指南或使用 VCR。

Feedjira 现在也在内部使用 VCR。 例子

例如,您可以在这样的 rspec 示例中使用 vcr,

it 'fetches and parses the feed' do
  VCR.use_cassette('success') do
    feed = Feedjira::Feed.fetch_and_parse 'http://feedjira.com/blog/feed.xml'
    expect(feed.last_modified).to eq('Fri, 07 Oct 2016 14:37:00 GMT')
  end
end
于 2016-11-12T19:59:47.013 回答