Опционально тестирование кеширования в функциональных тестах Rails 3 - PullRequest
18 голосов
/ 18 февраля 2011

Как правило, я хочу, чтобы мои функциональные тесты не выполняли кэширование действий.Rails, кажется, на моей стороне, по умолчанию config.action_controller.perform_caching = false в environment/test.rb.Это приводит к тому, что обычные функциональные тесты не тестируют кеширование.

Итак, как мне тестировать кеширование в Rails 3.

Решения, предлагаемые в этом потоке, кажутся довольно хакерскими или оторванными от Rails 2: Как включить кэширование страниц в функциональном тесте в рельсах?

Я хочу сделать что-то вроде:

test "caching of index method" do
  with_caching do
    get :index
    assert_template 'index'
    get :index
    assert_template ''
  end
end

Может быть, есть и лучший способ проверить, что кешбыл поражен?

Ответы [ 5 ]

30 голосов
/ 21 декабря 2011

Решение для rspec:

Добавьте в вашу конфигурацию блок с пользовательским ключом метаданных.

RSpec.configure do |config|
  config.around(:each, :caching) do |example|
    caching = ActionController::Base.perform_caching
    ActionController::Base.perform_caching = example.metadata[:caching]
    example.run
    Rails.cache.clear
    ActionController::Base.perform_caching = caching
  end
end

Добавьте ключ метаданных, когда необходимо кэширование.

describe "visit the homepage", :caching => true do
  # test cached stuff
end
28 голосов
/ 14 марта 2011

Вы можете столкнуться с тем, что тесты будут давить друг на друга. Вы должны завернуть это с гарантией и сбросить его к старым значениям соответственно. Пример:

module ActionController::Testing::Caching
  def with_caching(on = true)
    caching = ActionController::Base.perform_caching
    ActionController::Base.perform_caching = on
    yield
  ensure
    ActionController::Base.perform_caching = caching
  end

  def without_caching(&block)
    with_caching(false, &block)
  end
end

Я также поместил это в модуль, чтобы вы могли просто включить его в свой тестовый класс или родительский класс.

5 голосов
/ 10 февраля 2012

Моя версия, которая работает:

RSpec.configure do |config|
  config.around(:each) do |example|
    caching = ActionController::Base.perform_caching
    ActionController::Base.perform_caching = example.metadata[:caching]
    example.run
    Rails.cache.clear
    ActionController::Base.perform_caching = caching
  end
end

Кредит Россти, но

  1. Необходимо очищать кэш между примерами
  2. Невозможно установить хранилище кэшапо-разному на примерах, только в init, если кто-то интересуется
3 голосов
/ 29 июня 2015

Это не ответ, а несколько ограничений, о которых следует знать, которые не вписываются в комментарий.

  • Все (удивительные) ответы опираются на ActionController::Base.perform_caching не будет работать для низкоуровневого кэширования (ср. этот ответ ).Единственная опция, которая у вас есть, это независимая от модуля настройка config.cache_store, которую вы установили на :null_store.

  • Как сказал @ viktor-trón ранее, установка cache_store невозможна между тестами, только при инициализации.

  • Кэш распределяется между средами по умолчанию cache_store.В результате, (i) кэш должен быть очищен перед тестированием, если вы боитесь чего-либо из сеанса разработки, (ii) выполнение тестов очищает кэш других ваших сред.Тем не менее, ваша производственная среда должна использовать что-то вроде mem_cache_store или что-то еще более подходящее для этого, так что все должно быть в порядке.

Из двух первых пунктов кажется, что тестированиенизкоуровневое кэширование невозможно в качестве примера.

2 голосов
/ 18 февраля 2011

Вот мое текущее решение проблемы: В environment/test.rb я установил

config.action_controller.perform_caching = true

Кроме того, я обезьяна исправляю Test::Unit::TestCase следующим образом:

class Test::Unit::TestCase
  def setup_with_disable_caching
    setup_without_disable_caching
    disable_caching
  end
  alias_method_chain :setup, :disable_caching

  def disable_caching
    ActionController::Base.perform_caching = false
  end

  def enable_caching(&blk)
    ActionController::Base.perform_caching = true
    if blk
      yield
      disable_caching
    end
  end
end

Это позволяетмне написать следующие тесты:

test "info about caching (with caching)" do
  enable_caching do
    get :about, :locale => :en
    assert_template 'about'
    get :about, :locale => :en
    assert_template nil
  end
end

test "info about caching (without caching)" do
  get :about, :locale => :en
  assert_template 'about'
  get :about, :locale => :en
  assert_template 'about'
end

Это не идеально, но пока работает.Я все еще интересуюсь лучшими идеями !!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...