假设我们有一些像这样的代码:
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)
。
答案 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链式方法。