Cuando ejecuto las especificaciones de mi modelo y las especificaciones del controlador por separado, está bien. Cuando los ejecuto juntos, obtengo un desbordamiento de stack, 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 puedo empezar a depurar esto? Gracias.
Al eliminar la mitad de mis especificaciones a la vez, surgió el problema. Supongo que este es un ejemplo de depuración bisect. 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
Al parecer, incluye ir dentro de la describe
describe "Attendee#next_page" do include Rails.application.routes.url_helpers end
Tengo mucho que aprender sobre rspec. 🙂
Puede poner una statement del debugger
en su código y depurar de esa manera, o simplemente comenzar a usar el puts "got here"
en los lugares de su código que sabe que se están ejecutando. Yo sugeriría usar algo significativo en lugar de “llegar aquí” también 🙂
Comenzaría con las declaraciones de puts
o raise
en puntos clave de 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 la hayas bajado a una línea, puedes averiguar qué está haciendo esa línea que Ruby no hace. ‘T como.
En términos generales de dónde comenzar, “Nivel de stack demasiado profundo” suele ser un problema de bucle infinito o recursión infinita. Me imagino que algo está pasando cuando un modelo invoca un controlador que invoca al modelo, o viceversa. No hay forma de saberlo con certeza hasta que comience a comentar líneas, pero cualquier lugar donde tenga llamadas a funciones pertenecerá a su breve lista de sospechosos. ¡Buena suerte!
Posiblemente puede obtener el error “No se puede encontrar la línea coincidente de la marcha atrás” en caso de que esté comprobando alguna var que no se haya inicializado realmente
En este ejemplo, preste atención a la observación var que no se inicializa en el fragmento incorrecto
fragmento equivocado
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 dependemos del uso de let como inicializador, pero olvide agregarlo, por ejemplo,
let(:observation) {FactoryGirl.create(:observation)}