7

我们有一个使用 RSpec 测试的 Rails 应用程序。我们想要指定依赖于 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

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

4

2 回答 2

2

恕我直言,在没有存根的情况下进行测试!

序列如下所示:

  1. Cache.flush # 或等价物
  2. Cache.get(slug).shouldbe null # 测试缓存是否为空
  3. Method.find_by_slug(slug).should == 'some value' # 测试那个方法词
  4. Cache.get(slug).should == 'some value' # 测试缓存是否有价值。

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

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

这种情况下的一个例子是,如果您从标准的 memcache gem 切换到 Dahli? 或其他一些通过返回 false、null 或其他一些值来处理缓存未命中的 memcache gem。我是说真的!Cache.set("my_key", false)!:)

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

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

-丹尼尔

于 2011-05-22T20:03:46.717 回答
0

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

于 2014-02-10T06:51:54.050 回答