2012-12-21 11 views
10

Ich verwende RSpec (neueste Version, 2.12.2), um eine kleine Ruby-Klasse zu testen, an der ich gerade arbeite. Mein Problem ist, dass, wenn ein RSpec-Test fehlschlägt, die Testausgabe unglaublich ausführlich erscheint und eine riesige Liste von Fehlermeldungen zeigt, fast wie eine vollständige Rückverfolgung. Dies bedeutet, dass ich nach oben scrollen muss, um die tatsächliche Fehlermeldung und den Anfang der Ablaufverfolgung zu sehen.RSpec kürzere Backtrace-Ausgabe für Testfehler

Ich glaube standardmäßig RSpec soll dies tun, aber es scheint nicht für mich tun. Zum Beispiel, wenn ich laufen rspec spec/my_spec.rb:132 (nur ein Test durchgeführt, der auf L132 ist), erhalte ich diese Ausgabe:

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' 

die, wie Sie sehen können, ist absolut massiv. Ich habe keine RSpec-Konfigurationsdateien, die die an RSpec übergebene Konfiguration ändern könnten.

Hat jemand das schon mal gesehen? Ich habe versucht, zu googeln, aber Suchen waren fruchtlos.

Edit: Ich habe dann Config-up sicherzustellen, dass es die Standard-Backtrace Reinigung wurde die Anwendung:

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 

Aber das macht keinen Unterschied machen. Wenn man sich die Ausgabe anschaut, sollte das meiste davon herausgefiltert werden, aber es scheint, als ob die Konfiguration nicht angewendet wird.

Bearbeiten wieder:

In meiner config kann ich sogar cleaned_from_backtrace?(line) zu sehen, laufen, wenn eine Leitung gereinigt werden soll. Dies gibt 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'") 

Aber die tatsächliche Leistung in der Klemme bleibt gleich!

bearbeiten 3:

Ich betreibe RSpec mit dem Befehl rspec, und nichts mehr. Die .rspec-Datei des Projekts enthält:

--color 
--format progress 

Und es gibt keine ~/.rspec Datei entweder, dass die Anwendung Einstellungen werden könnten.

Antwort

11

So nach ein bisschen mehr im Chat mit der RSpec Folk on Github, gelang es mir, das Problem zu jagen.

Das Problem war, dass RSpec standardmäßig Linien aus dem Backtrace entfernt, die die Regex/Edelsteine ​​/ entsprechen. Ich hatte mein Projekt in einem Ordner mit gems im Namen: ~/Dropbox/rubygems/myproject, so dass jede Zeile der Backtrace entfernt wurde, und wenn dies passiert, zeigt RSpec sinnvollerweise die gesamte Backtrace.

Das erklärt das Verhalten, das ich sah.

Es ist immer etwas dummes so. Ich hoffe, wenn jemand anderes dies tut, wird diese Antwort vielleicht einige Zeit sparen.

+0

Haha, das ist brillant. Ich war schon immer verärgert, dass RSpec so ausführlich war ... ich wusste nicht, dass mein eigener Name dafür verantwortlich war! – RobinGower

+0

Sie können https://www.relishapp.com/rspec/rspec-core/docs/configuration/excluding-lines-from-the-backtrace verwenden, um ein benutzerdefiniertes Backtrace-Filtermuster hinzuzufügen. –

3

Sieht aus, als ob Sie RSpec mit -b ausführen, für eine vollständige Rückverfolgung. Normalerweise zeigt RSpec selbst dann keine eigene interne Rückverfolgung, wenn der Test schlecht abläuft (d. H. Eine Ausnahme auslöst und nicht nur eine Assertion). Wenn Sie es nicht explizit mit -b oder --backtrace ausführen, überprüfen Sie und stellen Sie sicher, dass Sie nicht in einer .rspec Konfigurationsdatei festgelegt, oder dass Ihre IDE oder was auch immer es nicht übergeben.

+0

Dank Jim - jedoch zuversichtlich, dass ich bin, dass ich nicht die Option 'b' ich die Anwendung überall - Ich habe gerade meine Frage aktualisiert, um dies deutlicher zu zeigen. –

1

Wie Jim sagte, gibt es eine -b oder --backtrace Option, die das vollständige Backtrace aktivieren wird. Bedenken Sie, dass es nicht nur die .rspec Datei ist, die es auslösen könnte; Es gibt auch ~/.rspec (für die bevorzugten Optionen eines Entwicklers).

Die andere Sache zu beachten ist, dass ein Formatierer spucken kann, was auch immer Teil der Backtrace, die es will. Die Formatierungen bieten eine einfache Möglichkeit für Drittanbieter-Formatierer, die backtrace-filtering-Konfiguration zu berücksichtigen. Da Sie jedoch einen Formatierer eines Drittanbieters verwenden, gibt es keine Garantie dafür, dass dieser Formatierer korrekt verwendet wird. Verwenden Sie einen der integrierten rspec-Formatierer?

Schließlich, wenn es nicht eines dieser Dinge ist, habe ich keine Ideen mehr. Ich müsste ein Beispiel haben, mit dem du deine Frage beantworten kannst. Kannst du ein reproduzierbares Beispiel (hoffentlich) finden? Ich versuche, regelmäßig im rspec-Kanal von irc.freenode.net herumzuhängen, also könntest du mich vielleicht dort erwischen und wir können auf diese Weise Fehler beheben.

+0

Ich habe meine Frage aktualisiert - ich habe eine '.rspec' im Projekt, aber es läuft keine Sache mit dem Backtrace, und es gibt auch keine' ~/.rspec'. –

0

Ab Version 3.4.0/2015.11.11 ist es möglich, Backtrace nach Möglichkeit zu filtern:

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