2012-02-19 18 views
13

Estoy probando un código de Ruby y tengo un Test :: Unit :: TestCase fallido. Lamentablemente, el informe de fallas solo me da el error principal, no un seguimiento completo de la pila. En concreto, se dice:Cómo obtener el seguimiento de la pila de un Test :: Unit :: TestCase

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

El número de la línea de referencia (73) es el comienzo de un bloque de código assert_nothing_raised en mi caso de prueba, que a su vez inicia otro bloque de código, que a su vez llama a un gran biblioteca.

He intentado ejecutar la prueba con el indicador --verbose, desafortunadamente esto no cambia la salida de la excepción. Intenté consultar la documentación de Test :: Unit, pero no parece enumerar las opciones disponibles (por ejemplo, no hay nada útil en here). Al buscar en la web y StackOverflow aparecieron algunas respuestas sobre cómo habilitar el seguimiento de pila en Rails, pero este no es un código de rubí de Rails.

Podría extraer el código defectuoso de la prueba y ejecutarlo fuera de Test :: Unit, lo que me permite ver todos los resultados. Pero será doloroso hacer esto cada vez que tenga una prueba fallida.

¿Alguien sabe cómo hacer que Test :: Unit me proporcione un seguimiento de pila completo?

+0

¿Está realizando su prueba con 'rake'? – Casper

+0

No, no ejecuta rake. –

+0

¿Esto fue en Ruby 1.8, Ruby 1.9 o ambos? –

Respuesta

14

Mirando el código de Test :: Unit en Ruby 1.8, parece que todos los errores pasan por el objeto Test :: Unit :: Error que filtra el backtrace en su método #long_display. No hay configuración y todos los corredores usarán la misma traza filtrada.

Bruto parche fuerza mono para conseguir toda la traza: (pongo esto en mi archivo de caso de prueba única, tal vez usted podría ponerlo en un ayudante de prueba)

require 'test/unit/util/backtracefilter' 

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

Y parche mono para Ruby 1.9 (que usa minitest)

def MiniTest.filter_backtrace(bt) 
    bt 
end 
+0

+1 ¡Has salvado mi vida! _ (o al menos cordura) _ :-) – Arsen7

1

Utilice esto en cualquier lugar de su clase para obtener el seguimiento completo de la pila. Lo usé en mi caso de prueba unitaria para depurar mi clase de prueba.

rescue => e 

puts e.inspect 

puts e.backtrace 
+0

Su solución está bien, pero el problema es que se anularía la necesidad de existencia de Test :: Unit: se sugiere rastrear manualmente todas las excepciones. La pregunta era: cómo reparar Test :: Unit para que sea útil de nuevo. – Arsen7

Cuestiones relacionadas