如何测试RSpec中的信号处理,特别是处理SIGTERM?

问题描述:

由于各种原因,Heroku可能会向您的应用程序发送SIGTERM,所以我创建了一个处理程序来处理某些清理以防发生这种情况。一些Google搜索没有得到任何关于如何在RSpec中进行测试的答案或示例。以下是基本代码:如何测试RSpec中的信号处理,特别是处理SIGTERM?

Signal.trap('TERM') do 
    cleanup 
end 

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

当程序收到SIGTERM时,测试这种清理方法的最佳方法是什么?

杀死你自己!通过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 

我只是测试的处理程序调用,但你同样可以测试处理器的副作用。