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无法测试自定义缓存存储的主要内容,如果未能解决你的问题,请参考以下文章

Rails:旧数据与新数据不匹配时如何更新片段缓存

如何使用 react-hooks-testing-library 测试自定义 async/await 钩子

为 memcached 和 Rails 组合片段和对象缓存的最佳方式

如何在片段着色器中进行自定义模板测试

Rail片段缓存如何使您的应用受益,即阻止数据库调用?

如何使控制台中的视图缓存片段过期?