ruby on rails spectroscopy rspec livello di stack troppo profondo




rspec spectroscopy (4)

Rimuovere metà delle mie specifiche alla volta ha sollevato il problema. Suppongo che questo sia un esempio di debug di bisect. Grazie a Frederick Cheung, il cui commento ha suggerito questo approccio.

Per i posteri, questo era il problema.

include Rails.application.routes.url_helpers
describe "Attendee#next_page" do
end

Apparentemente, include entrare nella describe

describe "Attendee#next_page" do 
  include Rails.application.routes.url_helpers
end

Ho molto da imparare su rspec. :)

Quando eseguo le specifiche del mio modello e le specifiche del controller separatamente, va bene. Quando li eseguo insieme, ottengo uno stack overflow, letteralmente :)

$ 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

Come posso iniziare a eseguire il debug di questo? Grazie.


Vorrei iniziare con puts o raise dichiarazioni nei punti chiave del codice in modo da poter iniziare a restringere la linea che sta causando il problema. Una volta che ti avvicini, puoi commentare una riga alla volta per capire con quale riga il problema scompare - non appena hai finito su una riga, puoi capire cosa sta facendo quella linea che Ruby non fa Mi piace

In termini generali di dove iniziare, "Stack level too deep" è in genere un loop infinito o un problema di ricorsione infinito - Immagino che stia accadendo qualcosa in cui un modello sta invocando un controller che sta invocando il modello o viceversa. Non c'è modo di saperlo con certezza fino a quando non inizi a commentare le righe, ma qualsiasi posto dove hai chiamate di funzione apparterrà alla tua lista dei sospetti. In bocca al lupo!


Puoi inserire un'istruzione debugger nel tuo codice ed eseguire il debug in questo modo, oppure iniziare a utilizzare puts "got here" nelle posizioni del codice che sai essere in esecuzione. Suggerirei di usare qualcosa di significativo invece di "arrivato qui" :-)


Forse puoi ottenere l'errore "Impossibile trovare la linea corrispondente da backtrace" nel caso in cui tu stia verificando alcune var che non sono state effettivamente inizializzate

In questo esempio fai attenzione all'osservazione var che non è inizializzata nel frammento sbagliato

snippet sbagliato

describe "GET index" do
  it "assigns all observations as @observations" do
    get :index, {}, valid_session
    assigns(:observations).should eq([observation])
  end
end

esempio fisso (riga 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 volte ci affidiamo all'utilizzo di let come inizializzatore, ma dimentichiamo di aggiungerlo, ad es

let(:observation) {FactoryGirl.create(:observation)}




rspec