Использование RSpec для тестирования области активной записи, которая использует метод include - PullRequest
1 голос
/ 12 июля 2011

Учитывая следующие два класса:

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 Query?

Ответы [ 2 ]

4 голосов
/ 22 июля 2011

После размещения в списке рассылки пользователей RSpec и прочтения больше о спецификациях в целом, я в конечном итоге пришел к выводу, что это не стоит модульного теста.Директива: includes хорошо протестирована на рельсах, и затраты на тестирование этой простой строки выше, чем риск, связанный с ее ошибкой или удалением другим разработчиком - по крайней мере, в моем случае.

Что меня действительно волнует, так это производительность приложения.Спецификация производительности была бы намного более продуктивной, чем прыжки через обручи для модульного тестирования этой линии.

3 голосов
/ 12 июля 2011

Посмотрите на Подсчет количества выполненных запросов .

Это должно отлично работать в вашем решении.Они сделали это:

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

Надеюсь, это сработает.

...