2012-09-24 9 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 

私は単にハンドラが呼び出されたことをテストしていますが、同様にうまくハンドラの副作用をテストすることができます。

関連する問題