2012-01-31 3 views
6

Je suis sûr qu'il me manque quelque chose de vraiment basique ici.Test d'un rappel before_save avec Rspec et Factory Girl

Je veux tester si un rappel before_save fait ce qu'il est censé faire, et pas seulement qu'il est appelé.

j'ai écrit le test suivant:

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 

et moi avons les usines suivantes pour course et 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 

et moi avons écrit le rappel suivant dans mon modèle 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 

Le test conserve f En disant que "got: nil" pour question_type au lieu de "lecture"

Comme je n'ai rien vu de mal avec mon code d'implémentation, j'ai essayé le callback dans mon environnement de développement et cela a fonctionné en ajoutant 'lecture' à Type de question.

Cela me fait penser que quelque chose ne va pas avec mon test. Qu'est-ce que j'oublie ici? Est-ce que Factory.create ignore les rappels par défaut?

+0

Au lieu de before_save, essayez before_validation – cpuguy83

Répondre

4

Je n'utiliserais pas Factory.create pour déclencher le processus. FactoryGirl doit être utilisé pour créer la configuration de test, pas pour déclencher le code que vous voulez tester. Votre test serait alors ressembler à:

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 ce test échoue encore, vous pouvez démarrer le débogage:

Ajoutez une instruction puts à l'intérieur add_type_to_question et un autre dans l'instruction if et de voir ce qui se passe.

Questions connexes