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

Heroku可能出于各种原因向您的应用程序发送SIGTERM,因此我创建了一个处理程序来处理一些清理,以防万一。 一些谷歌搜索没有得到任何关于如何在RSpec中测试这个问题的答案或例子。 这是基本代码:

Signal.trap('TERM') do cleanup end def cleanup puts "doing some cleanup stuff" ... exit end 

测试程序收到SIGTERM时调用此清理方法的最佳方法是什么?

杀了自己! 使用Process.kill 'TERM', 0将信号发送到RSpec Process.kill 'TERM', 0并测试是否调用了处理程序。 确实如果信号没有被捕获,测试会崩溃而不是很好地报告失败,但至少你会知道代码中存在问题。

例如:

 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 

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