我觉得这是一个没有太多记录的话题,至少我在这里找到了关于最佳实践的很多麻烦.
我使用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
Run Code Online (Sandbox Code Playgroud)
现在我可以在我的has_many关联的:belongs_to一侧添加:touch => true,这将完成我需要的所有内容,以保持此片段缓存最新,但对于我的生活,我很难搞清楚如何测试这个.
Drop in: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
Run Code Online (Sandbox Code Playgroud)
这些规格充实了Capybara的步骤,当然正在进行更新,我认为我在正确的轨道上.但测试以奇怪的方式闪烁.我会修改规范以输出员工对象cache_key,有时cache_keys会改变,有时候不会改变,有时规格会通过,有时候不会.
这甚至是一个好方法吗?
我知道SO想要回答的问题,所以要开始:当我的测试环境默认没有缓存时,如何设置和拆除此测试以使用缓存?但是,一般情况下,如果您取得了成功,我真的很想听听您如何在应用中成功测试片段缓存.
编辑
我接受了cailinanne的答案,因为它解决了我特别询问的问题,但我已经决定,如果你能摆脱它,我甚至不推荐集成测试缓存. …
我有一个Backbone收集规范(当然是todos),它使用Sinon伪造服务器响应和夹具数据.这通过独立的Jasmine但在我的Jasmine Headless Webkit设置下失败.
失败是这样的:
Todos collection when fetching models from the server should parse todos from the response.
Expected 0 to equal 2. (line ~58)
expect(this.todos.length).toEqual(this.fixture.response.todos.length);
Run Code Online (Sandbox Code Playgroud)
Sinon和我的夹具正确地返回了一个带有2个待办事项的假reposonse,但是在集合中没有解析todos.
有一个小提琴显示所有这些与Jasmine独立在这里工作
我的Jasmine Headless Webkit加载顺序如下:
clyde:backbone-jasmine andy$ jasmine-headless-webkit -l
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-core-1.1.0/lib/jasmine-core/jasmine.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-core-1.1.0/lib/jasmine-core/jasmine-html.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-core-1.1.0/lib/jasmine-core/jasmine.css
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/jasmine-extensions.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/intense.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/headless_reporter_result.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/jasmine.HeadlessConsoleReporter.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/jsDump.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-headless-webkit-0.8.4/vendor/assets/javascripts/beautify-html.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jquery-rails-2.0.2/vendor/assets/javascripts/jquery.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jquery-rails-2.0.2/vendor/assets/javascripts/jquery_ujs.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-core-1.1.0/lib/jasmine-core/json2.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/backbone-rails-0.9.2/vendor/assets/javascripts/underscore.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/backbone-rails-0.9.2/vendor/assets/javascripts/backbone.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/backbone-rails-0.9.2/vendor/assets/javascripts/backbone-rails.js
/Users/andy/Code/backbone-jasmine/app/assets/javascripts/app/collections/todos.js.coffee
/Users/andy/Code/backbone-jasmine/app/assets/javascripts/app/models/todo.js.coffee
/Users/andy/Code/backbone-jasmine/app/assets/javascripts/application.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-spec-extras-0.0.2/vendor/assets/javascripts/jasmine-jquery.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-spec-extras-0.0.2/vendor/assets/javascripts/sinon.js
/Users/andy/.rbenv/versions/1.9.3-p0/lib/ruby/gems/1.9.1/gems/jasmine-spec-extras-0.0.2/vendor/assets/javascripts/jasmine-sinon.js
/Users/andy/Code/backbone-jasmine/spec/javascripts/helpers/spec_helper.js.coffee
/Users/andy/Code/backbone-jasmine/spec/javascripts/helpers/valid_response.js.coffee
/Users/andy/Code/backbone-jasmine/spec/javascripts/fixtures/todos_fixture.js.coffee
/Users/andy/Code/backbone-jasmine/spec/javascripts/app/models/todo_spec.js.coffee
/Users/andy/Code/backbone-jasmine/spec/javascripts/app/collections/todos_spec.js.coffee
Run Code Online (Sandbox Code Playgroud)
和代码(当然也在小提琴中):
# abbreviated todo model
class window.Todo extends Backbone.Model
# complete todos collection
class window.Todos extends Backbone.Collection
model: …Run Code Online (Sandbox Code Playgroud)