¿Cómo hacer que rspec-2 proporcione el seguimiento completo asociado con un error de prueba?

96

En este momento, si ejecuto mi conjunto de pruebas con rake spec, obtengo un error:

1) SegmentsController GET 'index' debería funcionar
   Fallo / Error: obtener 'índice'
   método indefinido `locale 'para #
   # ./spec/controllers/segments_controller_spec.rb:14:
      en 'bloque (3 niveles) en'

Esto es normal ya que tengo un error :)

El problema es que la traza no es muy útil. Sé que entró segments_controller_spec.rb, línea 14, pero aquí es donde llamo a la prueba:

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

Preferiría tener el salto de línea real y el seguimiento completo, no la parte en la carpeta de especificaciones.

Correr con --traceno ayuda.

Marcgg
fuente
2
Compruebe spin.atomicobject.com/2010/12/28/rspec-backtrace-filtering Hay una manera de cambiar el filtrado de seguimiento de RSpec predeterminado
Bohdan

Respuestas:

244

Debes ejecutar rspec con la -bopción de ver trazos completos

solnic
fuente
9
No lo entiendo, ni esto ni la respuesta aceptada le dan un rastro posterior más allá de su archivo de especificaciones. O no funciona solo para mí o_O
janko-m
y fwiw, si usa rspec con spork y guard, puede crear un archivo .rspec y agregarle -b para obtener el resultado cuando ejecute su conjunto de pruebas
shicholas
De hecho, esta es la respuesta correcta: no necesita el rastreo completo (que incluye cosas como rieles y rspec y otras gemas) casi todo el tiempo; la única vez que lo necesita es para depurar o comprender algo causado por la gema sí mismo. Por lo tanto, apéguese a los patrones de limpieza de backtrace predeterminados y use -b en el caso extraño cuando lo necesite.
Asfand Qazi
No mostró información de seguimiento de pila sobre el error en sí. Más bien, mostró el rastro de la pila de la gema rspec
Aleksandrus
También funciona para RSpec 3
Koen.
29

Otra alternativa (más fácil) es editar el .rspecarchivo y agregar la backtraceopción. Debería verse algo así:

--colour
--backtrace

Eso le dará el rastreo completo. Espero que esto ayude.

nathanvda
fuente
¡Si! esto es exactamente lo que necesitaba. seguimiento de la pila hasta el error real, no la pila de especificaciones.
DiegoSalazar
Creo que la ortografía adecuada es color. Creo que si lo deletreas colourpodría aparecer una broma de Monty Python
WattsInABox
2
Apropiado si eres de América. En el Reino Unido escriben color, y la gente de rspec es muy amable al permitir ambos;)
nathanvda
2
¡Eso es una llave inglesa en el capó!
eggmatters
3

Esto también funcionará:

# rails_helper.rb
RSpec.configure do |config|
  config.full_backtrace = true
end
María V
fuente
2

Otro enfoque consiste en borrar todos los patrones de exclusión de rastreo hacia atrás en spec_helper.rb. Me gusta más esta solución, ya que puedo mantener todas las configuraciones de RSpec en un solo lugar y deshacerme .rspec fileo explícitamente --backtraceen .travis.yml.

# spec_helper.rb
RSpec.configure do |config|
  config.backtrace_exclusion_patterns = []
end
Nowaker
fuente
No parece tener esa opción en rspec 2.x.
Michael Yagudaev
1

No sé cómo hacer que aparezca el error del controlador en rspec. A veces aparece, pero no sé qué condiciones hacen que aparezca. Sin embargo, aquí hay una forma de ver el error con bastante rapidez:

Abra otra sesión de terminal y ejecute:

tail -f log/test.log

Luego regrese a la sesión de terminal y ejecute solo la especificación que tuvo el error:

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

Regrese al final del registro y debería ver el error, con suerte sin demasiadas cosas que lo rodean (porque ejecutó la prueba fallida por sí sola).

Benjamin Atkin
fuente
0

Una opción más cuando todo lo demás falla es simplemente agregar un bloque de rescate e imprimir el intento de pila o agregar una declaración de palanca vinculante allí y usar show-stack.

rescue Exception => e
  puts ""
  puts e.backtrace
  puts ""
Michael Yagudaev
fuente
A veces, esta es la mejor opción. Solo asegúrese de eliminarlo una vez que lo haga funcionar. Debe envolver el lugar donde espera que esté el error. Quizás ponga el beginy el rescuebloque como la declaración externa del método de acción del controlador. O usar rescue_from.
Benjamin Atkin
1
@bat sí, este es un intento de último recurso y, como dijo @bat, debe eliminarse una vez que lo haya descubierto. Recuerda siempre hacer lo tuyo git diffantes de cometerlo, te salvará el tocino.
Michael Yagudaev