rails example databasecleaner ruby-on-rails ruby rspec

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 :-)