2011-09-29 4 views
9

mixin을 통해 after_save 콜백을 주입하려고하는데, create 메서드가 호출 될 때 콜백이 두 번 호출되고 있음을 알리는 rspec 테스트가 있습니다. 이 메소드가 두 번 호출되는 이유는 무엇입니까? 실패 메시지가레일스 after_save 콜백이 여러 번 호출되었습니다

it 'should call callback' do 
    Product.any_instance.should_receive(:update_linkable_attachments).once 
    Product.create(:name=>'abc') 
end 

입니다

다음 RSpec에 테스트가 실패 : 여기

Failure/Error: Unable to find matching line from backtrace 
    (#<Product:0xb7db738>).update_linkable_attachments(any args) 
     expected: 1 time 
     received: 2 times 

module MainModuleSupport 
    def self.included(base) 
    base.instance_eval("after_save :update_linkable_attachments") 
    end 

    def update_linkable_attachments 
    LinkedAttachment.delay.create_from_attachment self 
    end 
end 

class Product < ActiveRecord::Base 
    include MainModuleSupport 
    ... 

end 

제품 클래스는 다른 코드가 코드,하지만 어떤이 없습니다 다른 콜백.

+0

레일 버전? 몇 가지 릴리스에서이 문제가 있다고 생각합니다. – tadman

+0

버전 3.0.8을 실행 중입니다. –

+0

제품과 관련된 제품이라면 LinkedAttachment가 생성 될 수 있습니다. – charlysisto

답변

5

after_save는 트랜잭션의 일부이므로 저장해야하는 다른 관련 객체가있는 경우 한 번 이상 호출 될 수 있습니다. 이런 경우에는 일반적으로 after_save 콜백에서 트랜잭션 완료 후에 만 ​​실행되는 after_commit 콜백으로 이동합니다.

+3

이것은 좋은 제안이지만 모든 작업 (저장 및 콜백 작업)이 단일 트랜잭션의 일부로 함께 커밋되었는지 확인하려면 어떻게해야합니까? – jn29098

관련 문제