Rspec - Должны ли мы использовать приборы для тестирования запроса к базе данных? - PullRequest
0 голосов
/ 21 декабря 2011

Используя ruby(1.8.7), rails(2.3.8), rspec(1.3.1) и rspec-rails(1.3.3), как мне протестировать метод, который полон сложных запросов SQL?Есть ли способ использовать заглушки и издевательства.Например, такой метод:

class Bucket << ActiveRecord::Base
  attr_accessor :students
  def populate_students_subassesmentwise(subassesment, mentor)
    student_ids = Mark.find(:all,
      :joins => "#{self.student_current_klass} #{self.current_mentors}",
      :conditions => ["marks.subject_id = ? AND st.klass_id = ? AND 
                   IF(sub.is_elective IS TRUE, 
                     (se.student_id = st.id AND se.subject_klass_id = marks.klass_id AND se.student_klass_id = st.klass_id AND marks.subject_id = se.subject_id),
                     (marks.klass_id = st.klass_id))
                   AND u.account_enabled IS TRUE AND sub.active IS TRUE AND k.active IS TRUE AND marks.markable_id = ? AND marks.markable_type = ?
                   AND ROUND(marks_obtained/marks_total*100) BETWEEN ? AND ? ",
                   mentor.subject_id, mentor.klass_id, subassesment.id, "Subassesment", min_range, max_range],
      :group => "marks.id").collect(&:student_id)

    self.assign_students(student_ids) # This is a call to another instance method that runs a query to find the students having ids equal to student ids and assign it to the students attr_accessor
  end
end

Как вы можете видеть, есть много предложений JOIN, IF и WHERE, которые больше говорят в терминах «СУБД», как мне писать тесты в Rspecчто будет издеваться над этим запросом?Или мы должны использовать светильники?

Ответы [ 2 ]

2 голосов
/ 21 декабря 2011

Лично я бы протестировал это с помощью приборов (точнее, FactoryGirl).Поскольку вы действительно тестируете свой код sql / database, мне кажется глупым не проверять это в базе данных.Если у вас нет отдельной установки для тестирования юнитов sql или чего-то подобного (мне это кажется излишним;) (в большинстве сценариев))

1 голос
/ 21 декабря 2011

Я не большой поклонник спагетти SQL, как это, потому что это становится мучительно трудно тестировать. Я бы сказал, что самый простой способ проверить это - сделать что-то вроде следующего:

  1. Добавить "Buckets" в вашу тестовую базу данных
  2. Убедитесь, что вы поместили некоторые из них в состояния, которые эти условия будут / не будут проходить
  3. Результаты тестов, убедившись, что вы получили то, что хотели, а не получили то, что не сделали

Вот как бы я это сделал, в любом случае.

Надеюсь, это поможет!

...