wes*_*ool 9 ruby unit-testing signals rspec sigterm
Heroku可能出于各种原因向您的应用程序发送SIGTERM,因此我创建了一个处理程序来处理一些清理,以防万一.一些谷歌搜索没有得到任何关于如何在RSpec中测试这个的答案或例子.这是基本代码:
Signal.trap('TERM') do
cleanup
end
def cleanup
puts "doing some cleanup stuff"
...
exit
end
Run Code Online (Sandbox Code Playgroud)
测试程序收到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
Run Code Online (Sandbox Code Playgroud)
我只是测试了处理程序被调用,但你同样可以测试处理程序的副作用.