rails test无法测试自定义缓存存储

时间:2018-01-03 11:06:59

标签: ruby-on-rails unit-testing testing caching automated-tests

在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时达到最低点。

更新

当我在测试中直接调用write方法时,它会起作用,但商店超类的fetch方法应调用write方法,如果它没有&#39 ;找到密钥并提供一个块。这适用于rails控制台,但不适用于测试。

1 个答案:

答案 0 :(得分:0)

我意识到缓存的内容(在这种情况下是存储在我的本地文件系统中的文件中)在测试之间,实际上,在测试套件的运行之间是持久的。

缓存存储的超类的fetch方法没有调用write方法,因为它在缓存中找到了条目。

因此,我需要在每次测试之前使用测试文件中的before方法清除缓存

before do
  store.clear
end