ruby - relish - RSpec uscita backtrace più breve per guasti di test



rspec rails (3)

Come ha detto Jim, c'è un'opzione -b o --backtrace che abiliterà il backtrace completo. Ricorda che non è solo il file .rspec che potrebbe .rspec ; c'è anche ~/.rspec (per le opzioni preferite di uno sviluppatore).

L'altra cosa da tenere a mente è che un formattatore può sputare qualsiasi parte del backtrace che desidera. I formattatori espongono un modo semplice per qualsiasi formattatore di terze parti di rispettare la configurazione di filtraggio backtrace, ma si sta utilizzando un formattatore di terze parti, non è garantito che lo stia usando correttamente. Stai usando uno dei formattatori rspec incorporati?

Infine, se non è una di quelle cose, sono fuori di idee. Dovrei avere un esempio con cui giocare per rispondere alla tua domanda. Puoi venire con un esempio riproducibile (in un senso, si spera)? Cerco di uscire regolarmente nel canale rspec di irc.freenode.net, quindi forse puoi trovarmi lì e possiamo risolvere alcuni problemi in questo modo.

Sto usando RSpec (ultima versione, 2.12.2) per testare una piccola classe di Ruby su cui sto lavorando. Il mio problema è che quando un test RSpec fallisce, l'output del test sembra incredibilmente prolisso e mostra un enorme elenco di messaggi di errore, quasi quello che sembra essere un backtrace completo. Ciò significa che devo scorrere verso l'alto per vedere il messaggio di errore effettivo e la parte superiore della traccia.

Credo che per impostazione predefinita RSpec dovrebbe fare questo, ma non sembra farlo per me. Ad esempio, se rspec spec/my_spec.rb:132 (esegui solo un test su L132), ottengo questo risultato:

 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'

Che, come puoi vedere, è assolutamente enorme. Non ho file di configurazione RSpec in giro che potrebbero alterare la configurazione passata a RSpec.

Qualcuno ha visto questo prima? Ho provato su Google ma le ricerche sono state infruttuose.

Modifica: ho quindi configurato la configurazione per accertarmi che applicasse la pulizia predefinita del backtrace:

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

Ma questo non fa la differenza. Osservando l'output, dovrebbe esserne la maggior parte filtrata, ma sembra che la configurazione non venga applicata?

Modifica di nuovo:

Nella mia configurazione, posso persino eseguire cleaned_from_backtrace?(line) per vedere se una riga deve essere pulita. Ciò restituisce 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'")

Ma l'output effettivo nel terminale rimane lo stesso!

Modifica 3:

Sto eseguendo RSpec con il comando rspec , e nient'altro. Il file .rspec del progetto contiene:

--color
--format progress

E non esiste ~/.rspec file ~/.rspec che potrebbe applicare le impostazioni.


Answer #1

Quindi, dopo aver chiacchierato un po 'di più con la gente di RSpec su Github , sono riuscito a dare la caccia al problema.

Il problema era che, per impostazione predefinita, RSpec rimuove le linee dal backtrace che corrisponde a Regex / gems /. Ho avuto il mio progetto all'interno di una cartella con gems nel nome: ~/Dropbox/rubygems/myproject , quindi ogni riga del backtrace veniva rimossa, e quando ciò accade, RSpec mostra sensibilmente l'intero backtrace.

Questo spiega il comportamento che stavo vedendo.

È sempre qualcosa di sciocco come quello. Spero che se qualcun altro lo fa, forse questa risposta li salverà un po 'di tempo.


Answer #2

Dalla versione 3.4.0 / 2015-11-11 è possibile filtrare il backtrace per opzione:

RSpec.configure do |config|
   config.filter_rails_from_backtrace!
end




rspec