Как включить кэш Rails для сценария с одним огурцом

Я написал задание cron для обновления некоторых кэшированных значений в фоновом режиме (вместо того, чтобы делать это, пока пользователь ждет). У меня есть сценарий, который запускает это задание cron, а затем читает кеш, чтобы убедиться, что значения установлены правильно.

Проблема в том, что Rails.cache.read("key") возвращает "Cache read: key\n", а не значение, и если я отлаживаю и проверяю Rails.cache, я получаю возвращенное ActiveSupport::Cache::BlackHoleStore - плохой знак.

Это, конечно, имеет смысл, потому что в мой cucumber.env включено следующее:

config.action_controller.perform_caching             = false
require File.join(RAILS_ROOT, 'lib', 'black_hole_store.rb')
config.cache_store = :black_hole_store

Что я хочу, так это переопределить это во время выполнения — у нас есть около тысячи сценариев, и это единственный, для которого требуется активный кеш. Я безуспешно пробовал следующее из приглашения отладчика:

(rdb:1) ActionController::Base.perform_caching = true
true
(rdb:1) ActionController::Base.perform_caching
true
(rdb:1) Rails.cache
#<ActiveSupport::Cache::BlackHoleStore:0x101b6dc60 @logger_off=false>
(rdb:1) ActionController::Base.cache_store = :memory_store
:memory_store
(rdb:1) Rails.cache
#<ActiveSupport::Cache::BlackHoleStore:0x101b6dc60 @logger_off=false>

Кто-нибудь знает, как это сделать?


person jim    schedule 03.05.2011    source источник


Ответы (3)


Итак, я в конце концов добрался до сути этого.

Короткий ответ: Rails.cache - это псевдоним для RAILS_CACHE, и хотя нет метода Rails.cache=, который вы можете назначить RAILS_CACHE, например:

ActionController::Base.perform_caching = true
ActionController::Base.cache_store = :memory_store
RAILS_CACHE = ActionController::Base.cache_store

Возможно, вы могли бы также сделать RAILS_CACHE = ActiveSupport::Cache.lookup_store(:memory_cache), но мне это кажется немного грязнее.

Более длинный ответ состоит в том, чтобы использовать шаг, чтобы обернуть таблицу других шагов кодом, который включает, а затем отключает кеш, чтобы гарантировать, что вы не сломаете другие тесты, оставив кеширование включенным - такую ​​​​ошибку неприятно отслеживать.

Это будет выглядеть примерно так:

When /^I do the following steps with caching enabled:$/ do |table|
  old_perform_caching = ActionController::Base.perform_caching
  old_action_controller_cache = ActionController::Base.cache_store
  old_rails_cache = RAILS_CACHE

  ActionController::Base.perform_caching = true
  ActionController::Base.cache_store = :memory_store
  RAILS_CACHE = ActionController::Base.cache_store

  steps table.raw.flatten.join("\n")

  ActionController::Base.perform_caching = old_perform_caching
  ActionController::Base.cache_store = old_action_controller_cache
  RAILS_CACHE = old_rails_cache
end

И его использование будет выглядеть примерно так:

 When I do the following steps with caching enabled:            
 | When I run "rake cron:nightly"             |
 | Then the cache for "x" should return "6"   |
 |  And the cache for "y" should return "13"  |
 |  And the cache for "z" should return "800" |

Шаги в таблице, очевидно, были реализованы в другом месте.

person jim    schedule 03.05.2011
comment
Альтернативой может быть пометка сценариев, которые вы хотите запустить с кешем, с помощью @cache. Затем вы можете реализовать логику, чтобы включить кеш перед сценариями и отключить его впоследствии в вашем файле env.rb в блоке до и после блока. - person AlistairH; 05.05.2011

Попробуйте это... пометьте свои сценарии @enable_caching и добавьте эти хуки в свой файл support/env.rb:

Before '@enable_caching' do
  ActionController::Base.perform_caching = true
end

After '@enable_caching' do
  ActionController::Base.perform_caching = false
end
person Andrew    schedule 20.09.2013

Кажется, это как-то связано с моим вопросом/ответом здесь. Проблема в том, что вы не можете изменить cache_store после инициализации Rails. Есть инициализатор кеша, который запускается во время инициализации Rails. Насколько я знаю, вы не можете изменить его после инициализации. Возможно, вы можете издеваться над чтением/записью кеша?

person Jack Chu    schedule 03.05.2011