卸下VCR盒式磁带不会导致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

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

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

你的理解是正确的,如果你删除你的磁带,你的测试套件将点击实际的API并重新创建磁带。您的规范可能正在通过,因为地下 API 返回了正确的结果!

请记住,VCR 是一种工具,它使我们不必使用真正的 API 来使我们的规范通过。 使用真正的 API 同样是使我们的规范通过的有效方法。这里的缺点是时间(使用外部服务需要时间)和您必须连接到互联网才能运行您的测试套件。

你有什么理由相信,如果你的测试套件达到了真正的Wunderground API,你的规范应该会失败吗?

最新更新