【问题标题】:removing VCR cassette does not cause RSpec to fail移除 VCR 磁带不会导致 RSpec 失败
【发布时间】:2016-01-23 22:42:37
【问题描述】:

我无法让 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

【问题讨论】:

    标签: ruby-on-rails rspec vcr


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-10-14
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多