我们有一个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
出于这个原因,在这种情况下缓存不仅仅是一个很好的行为,而是预期的行为和我想要测试的东西。因此,关闭缓存是行不通的。
答案 0 :(得分:2)
测试没有抄袭恕我直言!
序列如下所示:
就个人而言,我相信如果您手头有资源,那么不应该使用存根。如果您手边没有资源(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