Использование RSpec для тестирования области активной записи, использующей метод include

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

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?


person Derek Prior    schedule 12.07.2011    source источник


Ответы (2)


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

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

person Derek Prior    schedule 22.07.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

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

person Daniel Spangenberg    schedule 12.07.2011
comment
Я тестирую это сейчас. Не в восторге от помещения этого в пространство имен ActiveRecord, так что я немного поиграю с этим. - person Derek Prior; 12.07.2011
comment
это работало по большей части. Запросы на самом деле будут равны 2 (один для местоположений, один для всех связанных графиков выходных). По какой-то причине это будет работать при ручном запуске тестов, но при их запуске в Guard/Spork счет будет равен 6. Добавление моего фактического решения, которое является своего рода отговоркой, ниже. - person Derek Prior; 22.07.2011