2014-10-22 2 views
0

모델에서 콜백 존재 여부를 테스트 할 수 있습니다. 구체적으로는 after_create 또는 과 같이 레코드를 생성하여 트리거되는 콜백을 구체적으로 테스트 할 수 있습니까?ActiveRecord 콜백 테스트 있음

다음은 호출하는 (비어있는) 메소드가있는 콜백의 예입니다.

# app/models/inbound_email.rb 

class InboundEmail < ActiveRecord::Base 
    after_commit :notify_if_spam, on: :create 

    def notify_if_spam; end 
end 

여기에 호출되는 방법은 이동하는 방법처럼 보인다 테스트 할 message expectation를 사용 RSpec에 3

# spec/models/inbound_email_spec.rb 

describe InboundEmail do 
    describe "#notify_if_spam" do 
    it "is called after new record is created" 
    end 
end 

을 사용하여 보류중인 사양입니다. 예 :

expect(FactoryGirl.create(:inbound_email)).to receive(:notify_if_spam) 

하지만 작동하지 않습니다. 또 다른 방법은 레코드가 생성 될 때 호출 된 메소드 내부에서 발생하는 일 (예 : 이메일 전송, 메시지 로깅)을 테스트하는 것입니다. 이것은 메소드가 호출되어 콜백이 존재 함을 의미합니다. 그러나 나는 그와 같은 해결책을 찾고 있지 않기 때문에 당신이 정말로 다른 것을 테스트하고 있기 때문에 부주의 한 해결책을 찾는다.

+0

메시지 기대 효과가 좋지 않은 이유는 무엇입니까? –

+0

@PhilipHallstrom 왜 내가 메시지의 기대를 싫어하는 것 같지 않은가요? 내 예제에서 언급했듯이 솔루션에는 메시지 예상이 포함될 것으로 생각됩니다. – Dennis

+0

이 질문은 분명하지 않습니다. 메서드가 있는지 테스트하고 싶습니까? 아니면 콜백 호출 여부? – Substantial

답변

3

저는 Frederick Cheung이 옳다고 생각합니다. 이것은 효과가있다. 귀하의 예제에 문제가 있습니다. 전에 콜백이 이미 호출되었습니다. 기대가 설정되었습니다.

describe InboundEmail do 
    describe "#notify_if_spam" do 
    it "is called after new record is created" do 
     ie = FactoryGirl.build(:inbound_email) 
     expect(ie).to receive(:notify_if_spam) 
     ie.save! 
    end 
    end 
end 
+0

그게 다야! 당신의 예제에서'save'로'create'를 대체해야했습니다. 감사. – Dennis

관련 문제