ruby on rails - example - nivel de pila de rspec demasiado profundo
rails selenium (4)
Al eliminar la mitad de mis especificaciones a la vez, apareció el problema. Supongo que este es un ejemplo de depuración de bisección. Gracias a Frederick Cheung, cuyo comentario sugirió este enfoque.
Para la posteridad, este era el problema.
include Rails.application.routes.url_helpers
describe "Attendee#next_page" do
end
Aparentemente, incluye entrar dentro de la describe
describe "Attendee#next_page" do
include Rails.application.routes.url_helpers
end
Tengo mucho que aprender sobre rspec. :)
Cuando ejecuto las especificaciones de mi modelo y controlador por separado, está bien. Cuando los ejecuto juntos, obtengo un desbordamiento de pila, literalmente :)
$ bundle exec rspec --fail-fast spec/models
........
Finished in 0.44274 seconds
8 examples, 0 failures
$ bundle exec rspec --fail-fast spec/controllers
..
Finished in 0.99339 seconds
2 examples, 0 failures
$ bundle exec rspec --fail-fast spec
F
Failures:
1) HerpController derp derp example
Failure/Error: Unable to find matching line from backtrace
SystemStackError:
stack level too deep
# /Users/jared/.rvm/gems/ruby-1.9.2-p290/gems/actionpack-3.2.1/lib/abstract_controller/layouts.rb:359
Finished in 0.02241 seconds
1 example, 1 failure
¿Cómo empiezo a depurar esto? Gracias.
Comenzaría con puts
o raise
declaraciones en puntos clave en su código para que pueda comenzar a reducir qué línea está causando el problema. Una vez que empiezas a acercarte, puedes comentar una línea a la vez para averiguar con qué línea desaparece el problema, tan pronto como lo hayas reducido a una línea, podrás averiguar qué está haciendo esa línea que Ruby doesn ''T como.
En términos generales de por dónde empezar, "nivel de pila demasiado profundo" suele ser un problema de bucle infinito o de recursión infinita. Me imagino que algo está sucediendo cuando un modelo invoca un controlador que invoca el modelo o viceversa. No hay forma de saberlo con certeza hasta que comience a comentar las líneas, pero cualquier lugar donde tenga llamadas de función va a pertenecer a su lista corta sospechosa. ¡Buena suerte!
Es posible que obtenga el error "No se puede encontrar la línea coincidente desde el backtrace" en caso de que esté revisando alguna var que no se inicializó en realidad
En este ejemplo, preste atención a var observation que no se inicializa en el fragmento incorrecto
fragmento incorrecto
describe "GET index" do
it "assigns all observations as @observations" do
get :index, {}, valid_session
assigns(:observations).should eq([observation])
end
end
ejemplo fijo (línea 3)
describe "GET index" do
it "assigns all observations as @observations" do
observation = Observation.create! valid_attributes
get :index, {}, valid_session
assigns(:observations).should eq([observation])
end
end
A veces confiamos en usar let como inicializador, pero olvidamos agregarlo, por ejemplo
let(:observation) {FactoryGirl.create(:observation)}
Puede poner una declaración de debugger
en su código y depurar de esa manera, o simplemente comenzar a usar puts "got here"
en los lugares de su código que sabe que se están ejecutando. Sugeriría usar algo significativo en lugar de "llegar aquí" también :-)