我正在扩展ActiveSupport::Cache::FileStore
以使我自己将值备份到数据库中。这是迄今为止的样子:
class FileStoreWithDbBackup < ActiveSupport::Cache::FileStore
def write(name, value, options = nil)
super(name, value, options)
Rails.logger.debug('write!')
if options[:backup]
backup = CacheBackup.find_or_create_by(name: name)
backup.value = value
if options[:expires_in]
backup.expires = options[:expires_in].from_now
end
backup.save
end
end
end
当我从控制台使用它时似乎工作正常,但是当我在测试环境中尝试它时,超类功能起作用(它缓存并恢复值),但数据库备份不起作用。我需要更改测试环境配置吗?
我尝试将config.action_controller.perform_caching
设置为true
,但这不起作用。
这是我的测试文件(使用minitest-spec语法):
require 'test_helper'
require 'file_store_with_db_backup'
describe FileStoreWithDbBackup do
let(:store) {FileStoreWithDbBackup.new 'tmp/cache/'}
let(:key) {'data key'}
let(:payload) {'data value'}
it 'caches data' do
store.fetch(key){ payload }
fetched = store.fetch(key) do
fail('regenerating value')
end
_(fetched).must_equal payload
end
it 'backs up to db when asked' do
store.fetch(key, expires_in: 1.day, backup: true) { payload }
backup = CacheBackup.find_by_name key
_(backup.value).must_equal payload
_(backup.expires).must_be_close_to 1.day.from_now
end
end
第一次测试通过,第二次测试在无法找到CacheBackup
时达到最低点。
更新
当我在测试中直接调用write
方法时,它会起作用,但商店超类的fetch
方法应调用write
方法,如果它没有&#39 ;找到密钥并提供一个块。这适用于rails控制台,但不适用于测试。
答案 0 :(得分:0)
我意识到缓存的内容(在这种情况下是存储在我的本地文件系统中的文件中)在测试之间,实际上,在测试套件的运行之间是持久的。
缓存存储的超类的fetch
方法没有调用write方法,因为它在缓存中找到了条目。
因此,我需要在每次测试之前使用测试文件中的before
方法清除缓存
before do
store.clear
end