2012-09-24 16 views
9

Heroku puede enviar un SIGTERM a su aplicación por varias razones, por lo que he creado un controlador para que se ocupe de la limpieza en caso de que esto ocurra. Algunos google no han dado ninguna respuesta o ejemplos sobre cómo probar esto en RSpec. Aquí está el código básico:¿Cómo se prueba el manejo de señal en RSpec, particularmente el manejo de SIGTERM?

Signal.trap('TERM') do 
    cleanup 
end 

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

¿Cuál es la mejor manera de probar que este método de limpieza se llama cuando el programa recibe un SIGTERM?

Respuesta

3

¡Mátate! Envíe la señal a RSpec con Process.kill 'TERM', 0 y pruebe que se llama al controlador. Es cierto que si la señal no está atrapada, la prueba se bloqueará en lugar de informar correctamente una falla, pero al menos sabrá que hay un problema en su código.

Por ejemplo:

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 

Simplemente probado que el controlador se llama, pero igualmente bien podría probar un efecto secundario del manipulador.