我觉得这是一个没有太多文档记录的主题,至少我在这里找到我们的最佳实践时遇到了很多麻烦。
我在 View 中使用 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 的经历和进行更新的步骤充实了规范,我认为我走在正确的 rails 上。但是测试以奇怪的方式闪烁。我会修改规范以输出员工对象 cache_key,有时 cache_key 会改变,有时不会,有时规范会通过,有时不会。
这是一个好方法吗?
我知道 SO 想要可以回答的问题,所以首先要开始:当我的测试环境默认没有缓存时,我如何设置和拆除这个测试以使用缓存?不过,总的来说,如果您在这方面取得了成功,我真的很想听听您如何在您的应用中成功测试片段缓存。
编辑
我接受 cailinanne 的回答,因为它解决了我特别询问的问题,但我已经决定,如果您可以避开它,我什至不建议集成测试缓存。
我没有在我的关联声明中指定触摸,而是创建了一个特定于我的缓存需求的观察器,它直接接触模型,并单独测试它。
如果单独测试多模型观察者,我建议还包括检查观察者 observed_models 的测试,否则你会掩盖太多现实。
导致我这样做的具体答案在这里:https://stackoverflow.com/a/33869/717365
最佳答案
首先让我说,在这个答案中,你可能会得到比事实更多的同情。我一直在努力解决这些相同的问题。虽然我能够为特定测试获得可重现的结果,但我发现结果会根据我是否运行一个规范和多个规范以及在 spork 内或不在 spork 内而有所不同。叹息。
最后,我发现只要在 test.rb 文件中启用缓存,99.9% 的问题就会消失。这听起来可能很奇怪,但有些人认为这对我的申请来说是“正确的”。我的绝大多数测试都不在 View /请求层进行,对于少数在 View /请求层进行的测试,在用户查看的相同配置下进行测试是否有意义?
当我为此苦恼时,我写了一个 blog post其中包含一些用于测试缓存的有用测试助手。您可能会发现它很有用。
关于ruby-on-rails - 使用 RSpec 进行 Rails 片段缓存测试,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8482450/