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.
Puedes usar plymouth gem https://github.com/banister/plymouth para eso. Sin embargo, está utilizando la palanca , una (mejor) alternativa a irb .
HTH
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)>