Heroku的可以发送SIGTERM到你的应用由于种种原因,所以我创建了一个处理程序采取一些清理的情况下,出现这种情况的照顾。 一些谷歌搜索还没有产生关于如何RSpec的测试这个任何答案或例子。 这里是基本的代码:
Signal.trap('TERM') do
cleanup
end
def cleanup
puts "doing some cleanup stuff"
...
exit
end
什么是测试当程序接收到一个SIGTERM这种清理方法被调用的最好方法?
杀自己! 将信号发送到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
我只是测试的处理程序调用,但你同样可以测试处理器的副作用。