ruby-on-rails-3 - 复杂的 Arel 查询和 RSpec stub

标签 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

在指定此操作时,我们可以为每个示例编写一个 stub 链,但如果我们想专注于其他地方,这种方式会限制我们很多。

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

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

最佳答案

这可能是告诉您您在错误级别执行此操作的代码。我非常喜欢 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 链式方法。

关于ruby-on-rails-3 - 复杂的 Arel 查询和 RSpec stub ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6899497/

相关文章:

ruby-on-rails - Rails 无法写入数据库中的序列化数组字段

ruby-on-rails - 如何使用 has_and_belongs_to_many 在 Rails 中保存额外字段

ruby-on-rails - 序列化哈希 rails

javascript - Rails 3 中的 jQuery 带有 "Beginning Rails 3"

ruby - 如何防止update_attributes!快捷回调?

android - 当测试按下开始按钮时游戏没有开始

javascript - 如何解决TypeError : environment. teardown is not a function

ruby-on-rails - 我的 cookie token 是否足够强大,可以用于用户身份验证目的?

ruby-on-rails - ActionMailer 中的 :domain, :user_name, 和 :password

laravel - phpunit Guzzle 异步请求