ruby-on-rails - 使用 RSpec 进行 Rails 片段缓存测试

标签 ruby-on-rails caching testing rspec

我觉得这是一个没有太多文档记录的主题,至少我在这里找到我们的最佳实践时遇到了很多麻烦。

我在 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/

相关文章:

javascript - 向 Rails Controller 指示哪个 View 调用了操作

mysql - 应为此 MySQL 查询创建哪些索引

android - 为什么 DiskLruImageCache 会阻塞 I/O

android - Volley 和位图缓存

android - 如何使用 espresso 在 android 上模拟 AlertDialog 窗口外的触摸

java - 自动化应用程序发送短信的测试

ruby-on-rails - 如何使用 rspec 模拟/伪造文件的存在?

ruby-on-rails - 防止Rails中重复记录的正确方法

css - Bxslider:图像 slider 底部的灰色区域

android - Volley 使用 StringRequest 不调用 getParams 以在第一次后发送 POST 请求参数