【发布时间】:2012-01-18 22:15:03
【问题描述】:
我觉得这是一个没有太多文档记录的话题,至少我在找到我们的最佳实践方面遇到了很多麻烦。
我正在使用 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
现在我可以在我的 has_many 关联的 :belongs_to 一侧添加 :touch => true ,这将做我需要的一切来保持这个片段缓存是最新的,但是对于我的生活来说,我很难过弄清楚如何测试它。
加入 :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 想要可以回答的问题,所以开始:当我的测试环境默认没有缓存时,如何设置和拆除此测试以使用缓存?不过,总的来说,如果您在这方面取得了成功,我真的很想听听您如何成功地在您的应用中测试片段缓存。
编辑
我接受 cailinanne 的回答,因为它解决了我特别询问的问题,但我决定,如果您可以摆脱它,我什至不推荐集成测试缓存。
我没有在我的关联声明中指定触摸,而是创建了一个特定于我的缓存需求的观察者,它直接接触模型,并且正在单独测试它。
如果单独测试一个多模型观察者,我建议还包括一个检查观察者观察者模型的测试,否则你可能会忽略太多现实。
让我想到这个的具体答案在这里:https://stackoverflow.com/a/33869/717365
【问题讨论】:
-
嗨!你最终想出了一个成功的方法吗?为了完整起见,你能把它贴在这里吗?
-
呵呵,我应该一直读到最后……现在我意识到你决定不那样测试缓存了……
标签: ruby-on-rails caching testing rspec