Как включить кеш Rails для одного сценария огурца - PullRequest
1 голос
/ 03 мая 2011

Я написал задание 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>

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

Ответы [ 3 ]

2 голосов
/ 03 мая 2011

Хорошо, так что я, в конце концов, дошел до сути.

Краткий ответ: 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" |

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

2 голосов
/ 21 сентября 2013

Попробуйте это ... пометьте свои сценарии с помощью @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
0 голосов
/ 03 мая 2011

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

...