2012-01-31 17 views
6

Sono sicuro che mi manca qualcosa di veramente semplice qui.Test di un callback before_save con Rspec e Factory Girl

Voglio verificare se un callback before_save fa ciò che deve fare, non solo che è chiamato.

ho scritto il seguente test:

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 

e ho le seguenti fabbriche per course e 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 

e ho scritto il seguente richiamata nel mio modello 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 

Il test mantiene f sofferente dicendo "ottenuto: nil" per question_type invece di "lecture"

Poiché non ho visto nulla di evidentemente sbagliato nel mio codice di implementazione, ho provato il callback nel mio ambiente di sviluppo e ha effettivamente funzionato aggiungendo "conferenza" a tipo di domanda.

Questo mi fa pensare che potrebbe esserci qualcosa di sbagliato nel mio test. Cosa mi manca qui? Factory.create salta i callback di default?

+0

Invece di before_save provare prima_validazione – cpuguy83

risposta

4

Non utilizzare Factory.create per avviare il processo. FactoryGirl deve essere utilizzato per creare l'impostazione di prova, non per attivare il codice effettivo che si desidera testare. Il test sarebbe quindi simile:

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 

Se questo test non riesce ancora, è possibile avviare il debug:

aggiungere un'istruzione mette dentro add_type_to_question e un altro all'interno della dichiarazione if e vediamo cosa succede.

Problemi correlati