移除VCR盒不会导致RSpec失败

时间:2016-01-19 22:12:12

标签: ruby-on-rails rspec vcr

我无法让录像机重新录制录像带,所以我试图完全删除录像带,并且震惊地发现我的测试套件继续通过。这怎么可能?我的理解是盒式磁带是用于模拟外部API调用的灯具。没有它们,它应该实际上击中API并保存一个新盒式磁带。这是我的vcr.rb

require 'vcr'

VCR.configure do |c|
  c.cassette_library_dir = 'spec/fixtures/vcr'
  c.hook_into :webmock
  c.default_cassette_options = { serialize_with: :json, record: :once }
  c.debug_logger = File.open(Rails.root.join('log', 'vcr.log'), 'a')
  c.filter_sensitive_data('---WUNDERGROUND_KEY---') { ENV['WUNDERGROUND_KEY'] }
end

这是一个神秘的测试:

require 'spec_helper'

describe WeatherMan do
  describe ".current_outdoor_temp" do
    it "returns current outdoor temperature from Wunderground API" do
      VCR.use_cassette('wunderground') do
        temperature = WeatherMan.current_outdoor_temp(10004, 0)
        expect(temperature).to be_a Numeric
      end
    end
  end
end

2 个答案:

答案 0 :(得分:1)

我相信您的理解是正确的,如果您删除了磁带,您的测试套件将会触及实际的API并重新创建磁带。您的规范可能正在通过,因为Wunderground API正在返回正确的结果!

请记住,VCR是一种工具,可以帮助我们避免使用真正的API来使我们的规范通过。点击真正的API 只是作为一种使我们的规范通过的有效方法。这里的缺点是时间(需要时间来点击外部服务)和你必须连接到互联网到运行你的测试套件。

您是否有理由相信,如果您的测试套件符合真正的Wunderground API,您的规格应该会失败?

答案 1 :(得分:1)

我正在使用Rails缓存来避免在生产中多次使用相同的请求命中API,并且默认情况下 Rails使用:file_store持久化到光盘而不是内存而RSpec确实如此不清楚它。结果,我从未点击VCRWebMock或我的录音带。我第一次运行测试套件时,它将我的结果缓存在文件存储中,再也没有打过它们。您可以重新启动整台计算机,但它并没有什么不同。如果您习惯于在内存中缓存,这可能会让您感到困惑。将此添加到spec/spec_helper.rb修复了问题:

RSpec.configure do |config|
  ...
  config.before(:each) do
    Rails.cache.clear
  end
  ...
end