ruby - run - rspec spectroscopy
RSpec menor salida de traza inversa para fallas de prueba (4)
Así que después de conversar un poco más con la gente de RSpec en Github , logré cazar el problema.
El problema era que, de forma predeterminada, RSpec elimina las líneas de la traza inversa que coinciden con Regex / gems /. Tenía mi proyecto dentro de una carpeta con gems
en el nombre: ~/Dropbox/rubygems/myproject
, por lo que cada línea del backtrace se estaba eliminando, y cuando eso sucede, RSpec muestra sensiblemente toda la traza inversa.
Eso explica el comportamiento que estaba viendo.
Siempre es algo tonto como eso. Espero que si alguien más hace esto, tal vez esta respuesta les ahorrará algo de tiempo.
Estoy usando RSpec (última versión, 2.12.2) para probar una pequeña clase de Ruby en la que estoy trabajando. Mi problema es que cuando falla una prueba RSpec, el resultado de la prueba parece increíblemente prolijo, y muestra una enorme lista de mensajes de error, casi lo que parece ser un rastreo completo. Esto significa que tengo que desplazarme hacia arriba para ver el mensaje de error real y la parte superior del seguimiento.
Creo que por defecto se supone que RSpec hace esto, pero parece que no lo hace por mí. Por ejemplo, si ejecuto rspec spec/my_spec.rb:132
(simplemente ejecuto una prueba que está en L132), obtengo esta salida:
Failure/Error: @f.has_changed?("test").should be_true
expected: true value
got: false
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/fail_with.rb:33:in `fail_with''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/handler.rb:33:in `handle_matcher''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/syntax.rb:53:in `should''
# /Users/JackFranklin/Dropbox/Sites/rubygems/filefixtures/spec/filefixtures_spec.rb:137:in `block (4 levels) in <top (required)>''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:114:in `instance_eval''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:114:in `block in run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:254:in `with_around_each_hooks''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example.rb:111:in `run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:388:in `block in run_examples''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:384:in `map''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:384:in `run_examples''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:369:in `run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `block in run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `map''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `block in run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `map''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/example_group.rb:370:in `run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `block (2 levels) in run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `map''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:28:in `block in run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/reporter.rb:34:in `report''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/command_line.rb:25:in `run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/runner.rb:80:in `run''
# /Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-core-2.12.2/lib/rspec/core/runner.rb:17:in `block in autorun''
Lo cual, como puedes ver, es absolutamente masivo. No tengo ningún archivo de configuración RSpec que pueda estar alterando la configuración pasada a RSpec.
¿Alguien ha visto esto antes? He intentado con Google pero las búsquedas han sido infructuosas.
Editar: Luego configuré la configuración para asegurarme de que estaba aplicando la limpieza de rastreo inversa predeterminada:
RSpec.configure do |config|
# RSpec automatically cleans stuff out of backtraces;
# sometimes this is annoying when trying to debug something e.g. a gem
config.backtrace_clean_patterns = [
///lib/d*//ruby///,
/bin///,
/gems/,
/spec//spec_helper/.rb/,
/lib//rspec//(core|expectations|matchers|mocks)/
]
end
Pero esto no hace la diferencia. En cuanto a la salida, debería tener la mayor parte filtrada, pero parece que la configuración no se está aplicando.
Editar de nuevo:
En mi configuración, incluso puedo ejecutar cleaned_from_backtrace?(line)
para ver si se debe limpiar una línea. Esto devuelve true
:
config.cleaned_from_backtrace?("/Users/JackFranklin/.rbenv/versions/1.9.3-p194/lib/ruby/gems/1.9.1/gems/rspec-expectations-2.12.1/lib/rspec/expectations/fail_with.rb:33:in `fail_with''")
¡Pero la salida real en la terminal sigue siendo la misma!
Editar 3:
Estoy ejecutando RSpec con el comando rspec
, y nada más. El archivo .rspec
del proyecto contiene:
--color
--format progress
Y tampoco hay ningún archivo ~/.rspec
que pueda estar aplicando configuraciones.
Como dijo Jim, hay una opción -b
o --backtrace
que permitirá la --backtrace
completa. Tenga en cuenta que no es solo el archivo .rspec
el que podría desencadenarlo; también hay ~/.rspec
(para las opciones preferidas de un desarrollador).
La otra cosa a tener en cuenta es que un formateador puede escupir cualquier parte de la traza inversa que desee. Los formateadores exponen de manera simple que cualquier formateador de terceros respeta la configuración de filtrado de traza inversa, pero si utiliza un formateador de terceros, no hay garantía de que lo esté utilizando correctamente. ¿Estás utilizando uno de los formateadores rspec integrados?
Finalmente, si no es una de esas cosas, me he quedado sin ideas. Tendría que tener un ejemplo para jugar para responder a tu pregunta. ¿Puedes dar con un ejemplo reproducible (en un momento, con suerte)? Trato de pasar el rato en el canal de rspec de irc.freenode.net regularmente, así que tal vez puedas encontrarme allí y podamos solucionar algunos problemas de esa manera.
Parece que está ejecutando RSpec con -b
, para una traza inversa completa. Normalmente, RSpec no mostrará su propia traza inversa interna, incluso cuando la prueba falla mal (es decir, arroja una excepción en lugar de simplemente fallar una afirmación). Si no está ejecutando explícitamente con -b
o --backtrace
, verifique y asegúrese de que no tiene ese conjunto en un archivo de configuración .rspec
, o que su IDE o lo que sea no lo esté pasando.
A partir de la versión 3.4.0 / 2015-11-11 es posible filtrar traza inversa por opción:
RSpec.configure do |config|
config.filter_rails_from_backtrace!
end