如何测试信号处理中的RSpec,特别是处理SIGTERM的?(How to test signal

2019-09-22 23:12发布

Heroku的可以发送SIGTERM到你的应用由于种种原因,所以我创建了一个处理程序采取一些清理的情况下,出现这种情况的照顾。 一些谷歌搜索还没有产生关于如何RSpec的测试这个任何答案或例子。 这里是基本的代码:

Signal.trap('TERM') do  
    cleanup  
end

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

什么是测试当程序接收到一个SIGTERM这种清理方法被调用的最好方法?

Answer 1:

杀自己! 将信号发送到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

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



文章来源: How to test signal handling in RSpec, particularly handling of SIGTERM?