rails debug all ruby-on-rails rspec ruby-debug pry

ruby on rails - rails - Inicia ruby debugger si falla la prueba rspec



gem pry byebug (6)

A menudo, cuando falla una prueba, paso bastante tiempo tratando de averiguar qué causó que fallara. Sería útil si RSpec pudiera iniciar un depurador de Ruby cuando falla la prueba, de modo que pueda inspeccionar las variables locales de inmediato para averiguar la causa.

La solución temporal que estoy usando ahora se ve algo como esto:

# withing some test debugger unless some_variable.nil? expect(some_variable).to be_nil

Sin embargo, este enfoque es engorroso, porque primero espero a que falle una prueba, luego agrego la línea del depurador, soluciono el problema y luego tengo que eliminar la línea del depurador, mientras que quiero que funcione más como gdb que tiene la capacidad de activarlo. cuando se golpea una excepción, sin requerir salpicar su base de código con declaraciones del debugger .

Edit: He intentado Plymouth. No ha funcionado de forma suficientemente confiable para mí. Además, el historial de desarrollo parece indicar que no es una gema muy bien soportada, por lo que prefiero no confiar en ella.

Actualización : pry-rescue y lo encontré limpio. Sin embargo, uso mucho zeus y me preguntaba si hay alguna forma de hacerlo funcionar con pry-rescue .


Debe capturar la excepción ExpectationNotMatched mientras se está construyendo. Incluya el siguiente código en sus ayudantes en algún lugar y RSpec se detendrá cuando se construya la excepción. Estos serán varios niveles dentro de los emparejadores, por lo que en el depurador, diga "dónde", luego "arriba 5" o "arriba 6" y estará dentro de la instancia_exec de su bloque. El depurador no muestra el código correctamente en la versión que estoy usando, pero puede "subir" una vez más y obtener el código que se ejecuta en el mismo contexto donde se evalúa su prueba, por lo que puede inspeccionar las variables de instancia (pero No variables locales, parece).

require ''debugger'' require ''rspec'' Debugger.start class RSpec::Expectations::ExpectationNotMetError alias_method :firstaid_initialize, :initialize def initialize *args, &b send(:firstaid_initialize, *args, &b) puts "Stopped due to #{self.class}: #{message} at "+caller*"/n/t" debugger true # Exception thrown end end describe "RSpec" do it "should load use exceptions on should failure" do @foo = :bar # An instance variable I can examine 1.should == 2 end end


Me gusta la solución de @ jon-rowe (no se necesitan gemas adicionales) con una pequeña edición: realmente no me importan otros errores tanto como RSpec::Expectations::ExpectationNotMetError .

config.around(:each) do |example| example.run.tap do |result| debugger if result.is_a?(RSpec::Expectations::ExpectationNotMetError) end end


No obtendrá acceso a las variables locales (fácilmente) sin que el debugger esté dentro del alcance del bloque, sin embargo, RSpec proporciona alrededor de RSpec que le permiten hacer esto:

config.around(:each) do |example| result = example.run debugger if result.is_a?(Exception) puts "Debugging enabled" end

A continuación, tendrá acceso a los @ivars de @ivars y subject / let(:var) en este punto.


Puedes probar el hammertime . Se detendrá y le indicará que lo lleve a una sesión de depuración interactiva cada vez que se produzca una excepción.



Usa pry-rescue , es el sucesor espiritual de plymouth:

Desde el Readme:

Si está utilizando RSpec o respec, puede abrir una sesión de palanca en cada falla de prueba usando rescc rspec o rescat respec:

$ rescue rspec From: /home/conrad/0/ruby/pry-rescue/examples/example_spec.rb @ line 9 : 6: 7: describe "Float" do 8: it "should be able to add" do => 9: (0.1 + 0.2).should == 0.3 10: end 11: end RSpec::Expectations::ExpectationNotMetError: expected: 0.3 got: 0.30000000000000004 (using ==) [1] pry(main)>