2012-10-21 4 views
1

before_save 호출을 사용하여 특정 마스터에 속한 모든 레코드를 업데이트하고 있습니다. 두 항목 모두 item_id라는 필드가 있습니다.RSpec 및 팩토리 걸로 before_save 테스트하기

class Master < ActiveRecord::Base 
    has_many :records 
    before_save :update_records 
    def update_records 
    self.records.find_each do |r| 
     r.item_id = self.item_id 
     r.save 
    end 
    end 
end 

class Record < ActiveRecord::Base 
end 

의도 한대로 작동합니다 (이와 같은 작업을 수행하는 것이 좋습니다). 그러나 통과 RSpec 테스트를 얻을 수 없습니다. 이것이 제가 시도한 것입니다 :

describe Master do 
    describe 'before_save' do 
    it 'updates records belonging to it' do 
     master = FactoryGirl.create(:master, item_id: 1) 
     record = FactoryGirl.create(:record, master_id: master.id, item_id: 1) 
     master.item_id = 2 
     master.save 
     record.item_id.should == 2 
    end 
    end 
end 

그 이유는 흥미 롭습니다. 이 모델은 성공적으로 저장됩니다 레코드 모델의 두 번째 인스턴스에 대한 작업을 수행하지만 사양에 반환되지 않습니다 :

"MASTER - CREATED IN SPEC" 
#<Master:0x007fd0ed55ec20> { 
    :id => 26, 
    :item_id => 1, 
} 
"RECORD - CREATED IN SPEC" 
#<Record:0x007fd0ea157e40> { 
    :id => 16, 
    :item_id => 1, 
    :master_id => 26, 
} 
"RECORD - AFTER SAVE IN MODEL" 
#<Record:0x007fd0ed2f9a70> { 
    :id => 16, 
    :item_id => 2, 
    :master_id => 26, 
} 
"MASTER - UPDATED IN SPEC" 
#<Master:0x007fd0ed55ec20> { 
    :id => 26, 
    :item_id => 2, 
} 
"RECORD - FINAL IN SPEC" 
#<Record:0x007fd0ea157e40> { 
    :id => 16, 
    :item_id => 1, 
    :master_id => 26, 
} 

당신은 알고 계십니까 :
  • 왜 이런 일이?
  • 어떻게이 스펙을 통과시킬 수 있습니까?

답변

5

레코드가 이전 데이터를 표시하고있어 새로 고침해야하는 것 같습니다. 시도 :

record.reload.item_id.should == 2 
+0

그게 전부 야! 그래서 당신이 어떻게 알았을 때 간단 ;-) 많은 감사드립니다. –