2012-02-19 10 views
13

Sto testando un codice Ruby e ho un Test :: Unit :: TestCase in errore. Sfortunatamente, il rapporto di errore mi dà solo l'errore più alto, non una traccia dello stack completo. In particolare, si dice:Come ottenere la traccia dello stack da un Test :: Unit :: TestCase

1) Failure: 
test_tp_make(TestScripts::TestTpMake) [test/test_scripts.rb:73]: 
Exception raised: 
<#<NoMethodError: undefined method `[]' for nil:NilClass>>. 

Il numero di riga di riferimento (73) è l'inizio di un blocco di codice assert_nothing_raised nel mio banco di prova, che a sua volta avvia un altro blocco di codice, che a sua volta chiama ad una grande biblioteca.

Ho provato a eseguire il test con il flag --verbose, sfortunatamente questo non modifica l'output dell'eccezione. Ho provato a consultare la documentazione di Test :: Unit, ma non sembra enumerare le opzioni disponibili (ad esempio, non c'è nulla di utile here). La ricerca sul Web e StackOverflow hanno presentato alcune risposte su come abilitare la traccia dello stack in Rails, ma questo è il codice ruby ​​non Rails.

È possibile estrarre il codice in errore dal test ed eseguirlo all'esterno di Test :: Unit, consentendomi di vedere tutto l'output. Ma sarà doloroso farlo ogni volta che avrò un test fallimentare.

Qualcuno sa come ottenere Test :: Unit per darmi una traccia stack completa?

+0

Stai eseguendo il test con 'rake'? – Casper

+0

No, non è in esecuzione rake. –

+0

Era presente in Ruby 1.8, Ruby 1.9 o entrambi? –

risposta

14

Guardando attraverso il codice di Test :: Unit in Ruby 1.8, sembra che tutti gli errori passino attraverso l'oggetto Test :: Unit :: Error che filtra il backtrace nel suo metodo #long_display. Non c'è alcuna configurazione e tutti i corridori useranno la stessa traccia filtrata.

bruta patch di forza scimmia per ottenere l'intera traccia: (ho messo nel mio unico file di test case, forse si potrebbe mettere in un aiutante di prova)

require 'test/unit/util/backtracefilter' 

module Test::Unit::Util::BacktraceFilter 
    def filter_backtrace(backtrace, prefix=nil) 
    backtrace 
    end 
end 

e patch scimmia per Ruby 1.9 (che utilizza minitest)

def MiniTest.filter_backtrace(bt) 
    bt 
end 
+0

+1 Mi hai salvato la vita! _ (o almeno sanity) _ :-) – Arsen7

1

Utilizzare questo ovunque nella classe per ottenere la traccia di stack completo. L'ho usato nel mio caso di test dell'unità per eseguire il debug della mia classe di test.

rescue => e 

puts e.inspect 

puts e.backtrace 
+0

La tua soluzione è OK, ma il problema è che negherebbe la necessità dell'esistenza di Test :: Unit: ti suggeriamo di tracciare manualmente tutte le eccezioni. La domanda era: come riparare Test :: Unità per essere di nuovo utile. – Arsen7

Problemi correlati