2012-09-24 2 views
9

Heroku는 여러 가지 이유로 응용 프로그램에 SIGTERM을 보낼 수 있습니다. 따라서 이런 경우에 대비하여 처리 할 핸들러를 만들었습니다. 일부 인터넷 검색은 RSpec에서 이것을 테스트하는 방법에 대한 답변이나 예제를 제시하지 못했습니다.RSpec에서 신호 처리를 테스트하는 방법, 특히 SIGTERM을 다루는 방법?

Signal.trap('TERM') do 
    cleanup 
end 

def cleanup 
    puts "doing some cleanup stuff" 
    ... 
    exit 
end 

프로그램이 SIGTERM을 수신 할 때이 정리 메서드를 호출하는지 테스트하는 가장 좋은 방법은 무엇입니까 : 여기에 기본 코드는?

답변

3

자신을 죽여라! 신호를 Process.kill 'TERM', 0으로 RSpec에 전송하고 핸들러가 호출되는지 테스트합니다. 신호가 갇히지 않으면 실패를 잘보고하기보다는 테스트가 중단되지만 적어도 코드에 문제가 있음을 알 수 있습니다. 예를 들어

는 :

class SignalHandler 
    def self.trap_signals 
    Signal.trap('TERM') { term_handler } 
    end 

    def self.term_handler 
    # ... 
    end 

end 

describe SignalHandler do 
    describe '#trap_signals' do 
    it "traps TERM" do 
     # The MRI default TERM handler does not cause RSpec to exit with an error. 
     # Use the system default TERM handler instead, which does kill RSpec. 
     # If you test a different signal you might not need to do this, 
     # or you might need to install a different signal's handler. 
     old_signal_handler = Signal.trap 'TERM', 'SYSTEM_DEFAULT' 

     SignalHandler.trap_signals 
     expect(SignalHandler).to receive(:term_handler).with no_args 
     Process.kill 'TERM', 0 # Send the signal to ourself 

     # Put the Ruby default signal handler back in case it matters to other tests 
     Signal.trap 'TERM', old_signal_handler 
    end 
    end 
end 

나는 단지 핸들러가 호출 된 것을 테스트,하지만 당신은 동일하게 핸들러의 부작용을 테스트 할 수 있습니다.

관련 문제