2012-01-31 8 views
6

Estoy bastante seguro de que aquí me falta algo realmente básico.Probando una devolución de llamada before_save con Rspec y Factory Girl

Quiero probar si una devolución de llamada before_save hace lo que se supone que debe hacer, no solo que se llame.

me escribió la siguiente prueba:

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 

y tengo las siguientes fábricas para course y 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 

y yo escribimos la siguiente devolución de llamada en mi modelo 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 

La prueba mantiene f diciendo que "get: nil" para question_type en lugar de 'lecture'

Como no vi nada obviamente mal con mi código de implementación, probé la devolución de llamada en mi entorno de desarrollo y realmente funcionó agregando 'lecture' a tipo de pregunta.

Esto me hace pensar que puede haber algún problema con mi prueba. ¿Que me estoy perdiendo aqui? ¿Factory.create omite devoluciones de llamadas por defecto?

+0

En lugar de before_save, intenta before_validation – cpuguy83

Respuesta

4

No utilizaría Factory.create para activar el proceso. FactoryGirl se debe usar para crear la configuración de prueba, no para activar el código real que desea probar. Su prueba sería el siguiente aspecto:

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 

Si esta prueba sigue fallando, se puede iniciar la depuración:

Añadir una declaración pone dentro add_type_to_question y otro dentro de la instrucción if y ver qué pasa.

Cuestiones relacionadas