Тестирование обратного вызова before_save с Rspec и Factory Girl - PullRequest
6 голосов
/ 01 февраля 2012

Я почти уверен, что мне здесь не хватает чего-то действительно базового.

Я хочу проверить, выполняет ли обратный вызов before_save то, что он должен делать, а не только то, что он вызывается.

Я написал следующий тест:

it 'should add lecture to question_type' do      
  @course = Factory :course,
                    :start_time => Time.now - 1.hour,
                    :end_time => Time.now                        
  @question = Factory.create(:question, 
                             :course_id => @course.id, 
                             :created_at => Time.now - 10.minutes)                          
  @question.question_type.should == 'lecture'      
end

И у меня есть следующие фабрики для course и question:

Factory.define :course do |c|
  c.dept_code {"HIST"}
  c.course_code { Factory.next(:course_code) }
  c.start_time { Time.now - 1.hour }
  c.end_time { Time.now }
  c.lecture_days { ["Monday", Time.now.strftime('%A'), "Friday"]  }
end

Factory.define :question do |q|
  q.content {"Why don't I understand this class!?"}
  q.association :course
end

И я написал следующий обратный вызов в моем Question модель:

before_save :add_type_to_question

protected

def add_type_to_question
  @course = Course.find(self.course_id)
  now     = Time.now
  if (time_now > lecture_start_time && time_now < lecture_end_time ) && @course.lecture_days.map{|d| d.to_i}.include?(Time.now.wday)
    self.question_type = "lecture"
  end    
end

Тест продолжает проваливаться, говоря, что «got: nil» для question_type вместо «лекции»

Поскольку я не видел ничего явно неправильного в моем коде реализацииЯ пробовал обратный вызов в моей среде разработки, и он фактически работал, добавляя «лекцию» к question_type.

Это заставляет меня думать, что в моем тесте что-то не так.Что мне здесь не хватает?Factory.create пропускает обратные вызовы по умолчанию?

1 Ответ

5 голосов
/ 31 декабря 2012

Я бы не использовал Factory.create для запуска процесса.FactoryGirl следует использовать для создания настроек теста, а не для запуска фактического кода, который вы хотите протестировать.Ваш тест будет выглядеть следующим образом:

it 'should add lecture to question_type' do      
  course = Factory(:course, :start_time => Time.now - 1.hour, :end_time => Time.now)
  question = Factory.build(:question, :course_id => course.id, :created_at => Time.now - 10.minutes, :question_type => nil)

  question.save!                          
  question.reload.question_type.should == 'lecture'      
end

Если этот тест все еще не пройден, вы можете начать отладку:

Добавить оператор put внутри add_type_to_question, а другой - внутри оператора ifи посмотрим, что получится.

...