复杂的Arel查询和RSpec存根

时间:2011-08-01 13:58:30

标签: ruby-on-rails-3 testing activerecord rspec2 arel

假设我们有一些像这样的代码:

def index
  @posts = Post.where(:status => ACTIVE)
  if params[:s]
    @posts = Post.where("title like ?", "%#{params[:s]}%").order("title asc")
  else
    @posts = Post.limit(20).order("date desc")
  end
end

当指定这个动作时,我们可以为每个例子写一个存根链,但是如果我们想把它们集中在其他地方,它会给我们带来很多限制。

当您不知道订单或将调用多少方法时,为RSpec存根复杂的Arel查询的最佳方法是什么?

注意:我正在查看Stubbing Chained Queries in Rails 3 and Rspec,我认为我想要的是stub_chain_with_indifferent_order(:where, :order, :limit)

1 个答案:

答案 0 :(得分:2)

这可能是告诉您在错误级别执行此操作的代码。这是我非常喜欢RSpec的MOCK ALL THE THINGS(!!)哲学:如果它很难嘲笑,也许你的设计是错误的。

例如,我可能会将您的代码重构为:

def index
  @posts = Post.posts_for(:like => params[:s], :order => (params[:s] ? "title asc" : "date desc")
end

(或者根据您的域名稍微好一些。)

然后你可以模拟Posts.posts_for,一个简单的方法调用,而不是试图模拟大量的AR链式方法。