【问题标题】:is Rails.cache purged between tests?Rails.cache 在测试之间被清除了吗?
【发布时间】:2012-10-29 20:02:05
【问题描述】:

我们在 Rails 3.2 应用程序中使用 Rails.cache 缓存 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

【问题讨论】:

  • 测试环境有test
  • 我知道,但我只有这两个完整的config.cache_store

标签: ruby-on-rails ruby caching rspec


【解决方案1】:

添加:

before(:all) do
  Rails.cache.clear
end

在每个规范文件运行之前清除缓存。

添加:

before(:each) do
  Rails.cache.clear
end

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

您可以将它放在 RSpec.configure 块内的 spec/spec_helper.rb 内,以使其全局应用(建议不要将其分散在每个规范文件或案例中)。

RSpec 默认不会自动清除缓存。

【讨论】:

  • 为什么不在测试中禁用缓存?
  • @Francisco:因为它不会阻止获取缓存。 config.action_controller.perform_caching = false 似乎只是阻止填充缓存。
  • 如果我们在测试中禁用缓存,我们如何测试缓存的响应本身?我相信缓存验证是编程中最难的部分之一,所以如果我们有缓存响应,我们应该测试它们。
  • 你应该模拟缓存请求和响应。使用实际的缓存不必要地将您的测试代码与实现耦合。
  • 只是一个侧面,(至少对于 RSpec 3.8),要将其放入 spec/spec_helper.rb,您需要 config.before(:each) do blah end 而不是 before(:each) do blah end
【解决方案2】:

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

# config/environments/test.rb:
config.cache_store = :null_store

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

例如在下面的代码中,它总是会落到块中并返回当前时间:

Rails.cache.fetch('time') { Time.now }

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

【讨论】:

  • 唯一的问题是你不能测试缓存。
猜你喜欢
  • 2018-08-06
  • 2021-12-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多