如何规范依赖Memcached的操作?

时间:2011-05-11 18:07:49

标签: ruby-on-rails rspec memcached rspec-rails

我们有一个Rails应用程序,我们用RSpec测试。我们想要规范依赖于Memcached的操作。这样做的最佳做法是什么?

我想通过将所有调用存根到Rails.cache来实现此目的。这是个好主意吗?

根据@Pan Thomakos的建议,我正在添加一些有关我正在尝试测试的方案的其他详细信息:

我们的系统中有帐户的概念,因此在每次请求时我们都会检索当前用户和当前帐户。因为系统中的帐户不多,所以我们将它们全部保存在缓存中并从那里检索它们。

def self.find_by_slug(slug)  
  Rails.cache.fetch(Account.cache_key_for_slug(slug), :expires_in => 1.day) { super }  
end

出于这个原因,在这种情况下缓存不仅仅是一个很好的行为,而是预期的行为和我想要测试的东西。因此,关闭缓存是行不通的。

2 个答案:

答案 0 :(得分:2)

测试没有抄袭恕我直言!

序列如下所示:

  1. Cache.flush#或等效的
  2. Cache.get(slug).shouldbe null #test cache is empty
  3. Method.find_by_slug(slug).should =='some value'#test that method words
  4. Cache.get(slug).should =='some value'#test该缓存有价值。
  5. 就个人而言,我相信如果您手头有资源,那么不应该使用存根。如果您手边没有资源(IE是第三方服务),那么应该使用存根。

    存根问题是,如果您更改了存根的代码,那么您将不知道它是否会中断。

    在这种情况下的一个例子是,如果你从标准的memcache gem切换到Dahli ?,或者其他一些memcache gem,它通过返回false,null或其他一些不同的值来传递缓存未命中。我的意思是真的! Cache.set(“my_key”,false)! :)

    切换的一个例子是保留ASCII协议并转移到更快的二进制协议。

    Memcache是​​一种廉价资源,您可以使用1 meg的ram进行设置以进行此测试。我甚至会说你可以为mysql做同样的事情。任何比mysql更大的东西,然后我会开始倾向于存根,因为“设置”这些资源的成本变得很重要。 YMMV。

    -daniel

答案 1 :(得分:0)

看起来如果您直接使用Rails.cache.fetch,最好的选择是存根。但是如果你使用控制器帮助器(现在在导轨4中使用单独的宝石),我遇到了这个有用的宝石https://github.com/avit/rspec-rails-caching