Тестирование кеша фрагментов Rails с помощью RSpec - PullRequest
8 голосов
/ 13 декабря 2011

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

Я кеширую фрагменты в представлении, используяcache_key:

%tbody
  - @employees.each do |employee|
    - cache employee do
      %tr[employee]
        %td= employee.name
        %td= employee.current_positions
        %td= employee.home_base
        %td= employee.job_classes

Теперь я могу добавить: touch => true на сторону: own_to моих ассоциаций has_many, и это будет делать все, что мне нужно, чтобы этот фрагмент кэшировался в актуальном состоянии, но на всю жизньМне трудно понять, как это проверить.

Вставить: touch => true легко и удобно, но оно распространяет логику истечения на несколько мест.Я хотел бы иметь спецификацию запроса RSpec, которая просматривает и проверяет поведение этого, что не может сильно измениться, но может привести все требования к кешированию в один конкретный файл, который описывает, что должно происходить.

Я попытался сделать следующее:

require 'spec_helper'
include AuthenticationMacros

describe "Employee index caching" do

  before do
    Rails.cache.clear
    ActionController::Base.perform_caching = true
    login_confirmed_employee
  end

  after do
    ActionController::Base.perform_caching = false
  end

  specify "the employee cache is cleared when position assignments are modified"
  specify "the employee cache is cleared when home base assignments are modified"
end

Спецификации были уточнены с помощью шагов Capybara, чтобы пройти и, конечно, сделать обновления, и я подумал, что я на правильном пути.Но тесты мерцали странными способами.Я бы изменил спецификации для вывода объектов работника cache_key, и иногда cache_keys менялся, а иногда нет, иногда спецификации проходили, а иногда нет.

Это даже хороший подход?

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

EDIT

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

Вместо указания касанияв своих декларациях об ассоциации я создал наблюдателя, специфичного для моих потребностей в кэшировании, который напрямую касается моделей, и я тестирую его изолированно.

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

Конкретный ответ, который привел меня к этому, здесь: https://stackoverflow.com/a/33869/717365

Ответы [ 2 ]

7 голосов
/ 13 декабря 2011

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

В итоге я обнаружил, что 99,9% моих проблем исчезли, если я просто включил кэширование в своем файле test.rb. Это может показаться странным, но после некоторой мысли это было «правильно» для моего приложения. Подавляющее большинство моих тестов - , а не на уровне представления / запроса, и для немногих из них, имеет ли смысл тестировать в тех же конфигурациях, которые просматривает пользователь?

Пока я боролся с этим, я написал сообщение в блоге , которое содержит несколько полезных помощников для тестирования кэширования. Вы можете найти это полезным.

3 голосов
/ 08 января 2014

Вот то, что я использовал в своих спецификациях с включенным кэшированием в моем config / environment / test.rb

require 'spec_helper'
include ActionController::Caching::Fragments

describe 'something/index.html.erb' do
  before(:each) do 
    Rails.cache.clear
    render
  end
  it 'should cache my fragment example' do
    cached_fragment = Rails.cache.read(fragment_cache_key(['x', 'y', 'z']))
    cached_fragment.should have_selector("h1")
  end
end
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...