移除 VCR 磁带不会导致 RSpec 失败

removing VCR cassette does not cause RSpec to fail

我在让 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

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

请记住,VCR 是一种工具,它使我们不必通过真正的 API 来使我们的规格通过。达到真正的 API 只是 作为使我们的规格通过的有效方法。这里的缺点是时间(打外部服务需要时间)和you-must-be-connected-to-the-internet-to-run-your-test-suite.

您是否有任何理由相信如果您的测试套件达到了真正的 Wunderground API,您的规范应该会失败?

我使用 Rails 缓存以避免在生产中多次使用相同的请求访问 API,默认情况下 Rails 使用 :file_store 保留到光盘而不是内存 和 RSpec 不会为您清除它。结果,我从来没有敲过 VCRWebMock 或我的磁带。我第一次 运行 测试套件将我的结果缓存在文件存储中并且再也没有命中它们。您可以重新启动整个计算机,但没有任何区别。如果您习惯于在内存中缓存,这可能会困扰您。将此添加到 spec/spec_helper.rb 解决了问题:

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