移除 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 不会为您清除它。结果,我从来没有敲过 VCR
、WebMock
或我的磁带。我第一次 运行 测试套件将我的结果缓存在文件存储中并且再也没有命中它们。您可以重新启动整个计算机,但没有任何区别。如果您习惯于在内存中缓存,这可能会困扰您。将此添加到 spec/spec_helper.rb
解决了问题:
RSpec.configure do |config|
...
config.before(:each) do
Rails.cache.clear
end
...
end
我在让 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 不会为您清除它。结果,我从来没有敲过 VCR
、WebMock
或我的磁带。我第一次 运行 测试套件将我的结果缓存在文件存储中并且再也没有命中它们。您可以重新启动整个计算机,但没有任何区别。如果您习惯于在内存中缓存,这可能会困扰您。将此添加到 spec/spec_helper.rb
解决了问题:
RSpec.configure do |config|
...
config.before(:each) do
Rails.cache.clear
end
...
end