rails test无法测试自定义缓存存储
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了rails test无法测试自定义缓存存储相关的知识,希望对你有一定的参考价值。
在Rails 4.2中我正在扩展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
时达到最低点。
UPDATE
当我在测试中直接调用write
方法时,它可以工作,但是如果找不到密钥并且提供了块,那么商店超类的fetch
方法应该调用write
方法。这适用于rails控制台,但不适用于测试。
答案
我意识到缓存的内容(在这种情况下是存储在我的本地文件系统中的文件)在测试之间,实际上,在测试套件的运行之间是持久的。
缓存存储的超类的fetch
方法没有调用write方法,因为它在缓存中找到了条目。
因此,我必须在测试文件中使用before
方法在每次测试之前清除缓存
before do
store.clear
end
以上是关于rails test无法测试自定义缓存存储的主要内容,如果未能解决你的问题,请参考以下文章
如何使用 react-hooks-testing-library 测试自定义 async/await 钩子