是否在测试之间清除了Rails.cache?

mrz*_*asa 43 ruby caching rspec ruby-on-rails

我们Rails.cache在Rails 3.2应用程序中使用缓存id/path映射.在某些机器上它运行正常,但在其他机器上的值是错误的.原因很难跟踪,所以我对Rails.cache自己有一些疑问.它是在测试之间清除的吗?是否有可能在测试模式中使用在开发模式中缓存的值?如果它没有被清除,我怎么能在运行规范之前做到这一点?

我的缓存存储配置是:

#in: config/environments/development.rb
config.cache_store = :memory_store, {:size => 64.megabytes}

#in: config/environments/production.rb
# config.cache_store = :mem_cache_store
Run Code Online (Sandbox Code Playgroud)

jau*_*tin 67

更有效(也更简单)的方法是将测试环境的缓存设置为使用NullStore:

# config/environments/test.rb:
config.cache_store = :null_store
Run Code Online (Sandbox Code Playgroud)

NullStore确保不会缓存任何内容.

例如,在下面的代码中,它将始终落到块并返回当前时间:

Rails.cache.fetch('time') { Time.now }
Run Code Online (Sandbox Code Playgroud)

另请参阅Rails缓存指南:http://guides.rubyonrails.org/caching_with_rails.html#activesupport-cache-nullstore

  • 唯一的问题是你无法测试缓存. (40认同)

mrz*_*asa 45

加:

before(:all) do
  Rails.cache.clear
end
Run Code Online (Sandbox Code Playgroud)

在每个spec文件运行之前清除缓存.

加:

before(:each) do
  Rails.cache.clear
end
Run Code Online (Sandbox Code Playgroud)

在每个规范之前清除缓存.

你可以把这个里面spec/spec_helper.rb的内RSpec.configure块有它全局应用(建议在每个规格文件或情况下散播).

默认情况下,RSpec不会自动清除该缓存.

  • 请注意,这不会清除运行之间的缓存,只会在周围范围内的所有测试之间清除.之前(:每个)可能是你想要的. (14认同)
  • 如果我们在测试中禁用缓存,我们如何测试缓存的响应本身?我相信,缓存验证是编程中最困难的部分之一,因此如果我们缓存了响应,我们应该*测试它们. (5认同)
  • 把它改成以前怎么样:每个都做 (2认同)
  • 只是一方面,(至少对于 RSpec 3.8),要将其放入 `spec/spec_helper.rb` 中,您需要 `config.before(:each) do blah end` 而不是 `before(:each) do废话结束` (2认同)