使用RSpec测试使用includes方法的活动记录范围

时间:2011-07-12 14:57:33

标签: ruby-on-rails activerecord rspec named-scope

鉴于以下两个类:

class Location < ActiveRecord::Base
  belongs_to :holiday_schedule
  validates :name, :presence => true, :uniqueness => {:case_sensitive => false}
  scope :with_holiday_schedule, includes(:holiday_schedule)
end

class HolidaySchedule < ActiveRecord::Base
  validates_presence_of :name
  has_many :locations
end

如何规范with_holiday_schedule范围以确保在循环中访问location.holiday_schedule.name不会导致N + 1查询问题?

2 个答案:

答案 0 :(得分:4)

在向RSpec用户发送邮件列表并阅读更多有关一般情况下的搜索后,我最终意识到这不值得进行单元测试。 :includes指令在rails中经过了充分测试,测试该简单行的开销高于与其失败或被其他开发人员删除相关的风险 - 至少在我的情况下。

我真正关心的是应用程序的性能。指定性能比通过箍来对这条线进行单元测试要高效得多。

答案 1 :(得分:3)

查看Counting the number of queries performed

这应该在您的解决方案中完美运行。 他们做到了这一点:

ActiveRecord::Base.count_queries do
  Ticket.first
end

您可以在规范中使用这种方式:

queries = ActiveRecord::Base.count_queries do
  location.with_holiday_schedule.holiday_schedule.name
end
queries.should_be == 1

我希望这会奏效。