Wie kann man rspec-2 dazu bringen, die vollständige Ablaufverfolgung eines Testfehlers anzugeben?


96

Wenn ich jetzt meine Testsuite mit ausführe rake spec, wird folgende Fehlermeldung angezeigt:

1) SegmentsController GET 'Index' sollte funktionieren
   Fehler / Fehler: 'Index' abrufen
   undefinierte Methode `locale 'für #
   # ./spec/controllers/segments_controller_spec.rb:14:
      in `Block (3 Ebenen) in '

Dies ist normal, da ich einen Fehler habe :)

Das Problem ist, dass die Ablaufverfolgung nicht sehr hilfreich ist. Ich weiß, dass es eingebrochen ist segments_controller_spec.rb, Zeile 14, aber hier nenne ich den Test:

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

Ich würde es vorziehen, den eigentlichen Zeilenumbruch und die vollständige Ablaufverfolgung zu haben, nicht den Teil im Spezifikationsordner.

Laufen mit --tracehilft nicht.


2
Überprüfen Sie spin.atomicobject.com/2010/12/28/rspec-backtrace-filtering Es gibt eine Möglichkeit, die Standard-RSpec-Backtrace-Filterung zu ändern
Bohdan

Antworten:


244

Sie müssen rspec mit der -bOption ausführen , um vollständige Backtraces anzuzeigen


9
Ich verstehe es nicht, weder diese noch die akzeptierte Antwort geben Ihnen einen Rückblick weiter als von Ihrer Spezifikationsdatei. Oder es funktioniert nicht nur für mich o_O
janko-m

und fwiw, wenn Sie rspec mit spork und guard verwenden, können Sie eine .rspec-Datei erstellen und -b hinzufügen, um die Ausgabe zu erhalten, wenn Sie Ihre Testsuite
ausführen

Dies ist in der Tat die richtige Antwort - Sie benötigen fast immer nicht den vollständigen Backtrace (der Dinge wie Rails und Rspec und andere Edelsteine ​​enthält) - das einzige Mal, dass Sie ihn jemals brauchen, ist das Debuggen oder Verstehen von etwas, das durch den Edelstein verursacht wird selbst. Halten Sie sich also an die Standard-Backtrace-Clean-Muster und verwenden Sie -b im ungeraden Fall, wenn Sie es benötigen.
Asfand Qazi

Es wurden keine Stack-Trace-Informationen zum Fehler selbst angezeigt. Vielmehr zeigte es die Stapelspur des Edelsteins rspec
Aleksandrus

Funktioniert auch für RSpec 3
Koen.

29

Eine andere (einfachere) Alternative besteht darin, die .rspecDatei zu bearbeiten und die backtraceOption hinzuzufügen . Es sollte ungefähr so ​​aussehen:

--colour
--backtrace

Das gibt Ihnen die volle Rückverfolgung. Hoffe das hilft.


Ja! Das ist genau das, was ich brauchte. Stapelverfolgung zum tatsächlichen Fehler, nicht zum Spezifikationsstapel.
Diego Salazar

Ich glaube, die richtige Schreibweise ist color. Ich denke, wenn Sie es buchstabieren, könnte colourein Monty Python-Witz auftauchen
WattsInABox

2
Geeignet, wenn Sie aus Amerika kommen. In Großbritannien schreiben sie Farbe, und die Rspec-Leute sind so freundlich, beides zuzulassen;)
Nathanvda

2
Das hat einen Schraubenschlüssel in die Motorhaube geworfen!
Eggmatters

3

Dies wird auch funktionieren:

# rails_helper.rb
RSpec.configure do |config|
  config.full_backtrace = true
end

2

Ein anderer Ansatz besteht darin, alle Backtrace-Ausschlussmuster in zu löschen spec_helper.rb. Ich mag diese Lösung der meisten , wie ich bin in der Lage , alle RSpec Einstellungen an einem Ort zu halten und loswerden .rspec fileoder explizit --backtracein .travis.yml.

# spec_helper.rb
RSpec.configure do |config|
  config.backtrace_exclusion_patterns = []
end

Scheint diese Option in rspec 2.x nicht zu haben.
Michael Yagudaev

1

Ich weiß nicht, wie ich den Controller-Fehler in rspec anzeigen lassen kann. Manchmal taucht es auf, aber ich weiß nicht, unter welchen Bedingungen es auftaucht. Hier ist eine Möglichkeit, den Fehler ziemlich schnell zu erkennen:

Öffnen Sie eine andere Terminalsitzung und führen Sie Folgendes aus:

tail -f log/test.log

Kehren Sie dann zur Terminalsitzung zurück und führen Sie nur die Spezifikation aus, bei der der Fehler aufgetreten ist:

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

Gehen Sie zurück zum Ende des Protokolls und Sie sollten den Fehler sehen, hoffentlich ohne zu viele andere Dinge, die ihn umgeben (weil Sie den fehlgeschlagenen Test selbst ausgeführt haben).


0

Eine weitere Option, wenn alles andere fehlschlägt, besteht darin, einfach einen Rettungsblock hinzuzufügen und den Stapelversuch auszudrucken oder dort eine verbindliche Pry-Anweisung hinzuzufügen und zu verwenden show-stack.

rescue Exception => e
  puts ""
  puts e.backtrace
  puts ""

Dies ist manchmal die beste Option. Stellen Sie einfach sicher, dass Sie es entfernen, sobald es funktioniert. Es sollte die Stelle einschließen, an der Sie den Fehler erwarten. Setzen Sie möglicherweise das beginund rescueblock als äußere Anweisung der Aktionsmethode des Controllers. Oder verwenden rescue_from.
Benjamin Atkin

1
@bat Ja, dies ist ein letzter Versuch und muss, wie @bat sagte, entfernt werden, sobald Sie es herausgefunden haben. Denken Sie immer daran, dies zu tun, git diffbevor Sie es festlegen, um Ihren Speck zu schonen.
Michael Yagudaev
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.