我无法让录像机重新录制录像带,所以我试图完全删除录像带,并且震惊地发现我的测试套件继续通过。这怎么可能?我的理解是盒式磁带是用于模拟外部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
答案 0 :(得分:1)
我相信您的理解是正确的,如果您删除了磁带,您的测试套件将会触及实际的API并重新创建磁带。您的规范可能正在通过,因为Wunderground API正在返回正确的结果!
请记住,VCR是一种工具,可以帮助我们避免使用真正的API来使我们的规范通过。点击真正的API 只是作为一种使我们的规范通过的有效方法。这里的缺点是时间(需要时间来点击外部服务)和你必须连接到互联网到运行你的测试套件。
您是否有理由相信,如果您的测试套件符合真正的Wunderground API,您的规格应该会失败?
答案 1 :(得分:1)
我正在使用Rails缓存来避免在生产中多次使用相同的请求命中API,并且默认情况下 Rails使用:file_store
持久化到光盘而不是内存而RSpec确实如此不清楚它。结果,我从未点击VCR
,WebMock
或我的录音带。我第一次运行测试套件时,它将我的结果缓存在文件存储中,再也没有打过它们。您可以重新启动整台计算机,但它并没有什么不同。如果您习惯于在内存中缓存,这可能会让您感到困惑。将此添加到spec/spec_helper.rb
修复了问题:
RSpec.configure do |config|
...
config.before(:each) do
Rails.cache.clear
end
...
end