Come ottenere rspec-2 per fornire la traccia completa associata a un errore del test?


96

In questo momento se eseguo la mia suite di test utilizzando rake specottengo un errore:

1) SegmentsController GET "index" dovrebbe funzionare
   Fallimento / Errore: ottieni "indice"
   metodo non definito `locale 'per #
   # ./spec/controllers/segments_controller_spec.rb:14:
      in "blocco (3 livelli) in"

Questo è normale perché ho un errore :)

Il problema è che la traccia non è molto utile. So che si è rotto segments_controller_spec.rb, riga 14, ma è proprio qui che chiamo il test:

### segments_controller_spec.rb:14
get 'index'

Preferirei avere l'interruzione di riga effettiva e la traccia completa, non la parte nella cartella delle specifiche.

Correre con --tracenon aiuta.


2
Controllare spin.atomicobject.com/2010/12/28/rspec-backtrace-filtering C'è un modo per modificare il filtro di backtrace RSpec predefinito
Bohdan

Risposte:


244

È necessario eseguire rspec con l' -bopzione per visualizzare i backtrace completi


9
Non capisco, né questa né la risposta accettata ti danno un backtrace più lontano dal tuo file delle specifiche. Oppure non funziona solo per me o_O
janko-m

e fwiw se usi rspec con spork e guard puoi creare un file .rspec e aggiungere -b ad esso per ottenere l'output quando esegui la tua suite di test
shicholas

Questa è davvero la risposta corretta - non hai bisogno del backtrace completo (che include cose come rails e rspec e altre gemme) quasi sempre - l'unica volta che ne hai bisogno è eseguire il debug o capire qualcosa causato dalla gemma si. Quindi attenersi ai modelli puliti di backtrace predefiniti e utilizzare -b nel caso dispari quando ne hai bisogno.
Asfand Qazi

Non mostrava le informazioni sulla traccia dello stack sull'errore stesso. Piuttosto, ha mostrato la traccia dello stack della gemma rspec
Aleksandrus

Funziona anche per RSpec 3
Koen.

29

Un'altra alternativa (più semplice) è modificare il .rspecfile e aggiungere l'estensionebacktrace opzione. Dovrebbe essere simile a questo:

--colour
--backtrace

Questo ti darà il backtrace completo. Spero che questo ti aiuti.


Sì! questo è esattamente ciò di cui avevo bisogno. traccia dello stack sull'errore effettivo e non sullo stack delle specifiche.
DiegoSalazar

Credo che l'ortografia appropriata sia color. Penso che se lo colour
scrivi

2
Appropriato se vieni dall'America. Nel Regno Unito scrivono a colori e la gente di rspec è così gentile da consentire entrambi;)
nathanvda

2
È stata lanciata una chiave inglese nel cofano!
pasta d'uovo

3

Funzionerà anche:

# rails_helper.rb
RSpec.configure do |config|
  config.full_backtrace = true
end

2

Un altro approccio consiste nell'eliminare tutti i modelli di esclusione del backtrace in spec_helper.rb. Mi piace questa soluzione più come io sono in grado di mantenere tutte le impostazioni RSpec in un unico luogo e di sbarazzarsi di .rspec fileo esplicita --backtracein .travis.yml.

# spec_helper.rb
RSpec.configure do |config|
  config.backtrace_exclusion_patterns = []
end

Non sembra avere questa opzione in rspec 2.x.
Michael Yagudaev

1

Non so come visualizzare l'errore del controller in rspec. A volte si presenta ma non so quali condizioni lo facciano apparire. Ecco un modo per vedere l'errore abbastanza rapidamente:

Apri un'altra sessione di terminale ed esegui:

tail -f log/test.log

Quindi torna alla sessione del terminale ed esegui solo la specifica che aveva l'errore:

bin/rspec -b spec/requests/posts/index_spec.rb

Torna alla fine del registro e dovresti vedere l'errore, si spera senza troppe altre cose che lo circondano (perché hai eseguito il test fallito da solo).


0

Un'altra opzione quando tutto il resto fallisce è semplicemente aggiungere un blocco di salvataggio e stampare lo stack try o aggiungere un'istruzione pry vincolante lì e utilizzare show-stack.

rescue Exception => e
  puts ""
  puts e.backtrace
  puts ""

A volte questa è l'opzione migliore. Assicurati solo di rimuoverlo una volta che lo fai funzionare. Dovrebbe avvolgere il punto in cui ti aspetti che si trovi l'errore. Forse metti il blocco begine rescuecome istruzione esterna del metodo di azione del controller. Oppure usa rescue_from.
Benjamin Atkin,

1
@bat sì, questo è un tentativo di ultima istanza e come ha detto @bat deve essere rimosso una volta capito. Ricorda sempre di fare il tuo git diffprima di impegnarti, salverai la tua pancetta.
Michael Yagudaev
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.