2011-05-11 54 views
7

我们有一个我们用RSpec测试的Rails应用程序。我们希望规范依赖Memcached的操作。这样做的最佳做法是什么?如何规范依赖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 

为此,缓存在这种情况下,不仅是一个不错的表现,但预期的行为,我想测试的东西。因此关闭缓存不会。

+0

如果你提供关于Memcached上的依赖关系的更多信息可能会有所帮助或者您尝试测试的一些操作。您可以随时关闭缓存,以便您的测试完全忽略Rails.cache。那是你在找什么? – 2011-05-11 20:00:36

+0

谢谢。我修改了我的问题。 – arikfr 2011-05-13 06:41:29

回答

2

测试没有残留恕我直言!

的顺序是这样的:

  1. Cache.flush#或同等
  2. Cache.get(塞).shouldbe空#测试缓存为空
  3. Method.find_by_slug(塞)。应该=='一些值'#测试该方法的字
  4. Cache.get(slug).should =='some value'#测试缓存是否有价值。

就我个人而言,我相信如果你手边有资源,那么不应该使用存根。如果您手边没有资源(IE为第三方服务),则应使用存根。

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

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

切换的一个例子是离开ASCII协议并移动到更快的二进制协议。

Memcache是​​一个便宜的资源,你可以设置它与1兆内存来做这个测试。我甚至会说,你可以为MySQL做同样的事情。任何大于mysql的东西,那么我会开始倾向于扼杀,因为“设置”这些资源的成本变得很大。因人而异。

-daniel

+0

谢谢!我们开始时没有剔除,但是在测试之前我们必须确保Memcached正在运行。这不是一个资源问题,但更多的是方便的问题。我们希望能够尽可能少地设置运行测试。 (拆分为3条评论使其更具可读性) – arikfr 2011-05-23 05:59:49

+1

此外,虽然我同意存根有其缺点,但它有一个主要的优势 - 速度。虽然在这种情况下它并不重要,因为Memcached在其他情况下速度很快,所以它很重要。 – arikfr 2011-05-23 06:03:06

+0

我想我们需要决定是否需要更可靠的测试或更方便的测试:/也许我们会做两组测试 - 一组使用Memcached,将用于CI服务器,一组不使用开发人员机器。 – arikfr 2011-05-23 06:03:38