Ruby Debug in rspec ausführen?


77

Ich versuche, den Ruby-Debugger in einer meiner Spezifikationen zum Laufen zu bringen:

describe User do
  it "should be valid" do
    debugger
    User.new.should be_valid
  end
end

Wenn ich rspec starte, bekomme ich:

debugger statement ignored, use -d or --debug option to enable debugging

Ich habe folgendes versucht:

rake spec --debug
rake spec --debug  --trace
rake spec:models --debug
bundle exec rspec --debug
bundle exec rspec --debug spec/models/
bundle exec rspec --d spec/models/
bundle exec "rspec --debug" spec/models/
bundle exec rspec --debugger spec/models/
bundle exec --debugger rspec spec/models/
bundle --debugger exec rspec spec/models/
bundle --debugger exec rspec spec/models/
bundle exec --debugger rspec spec/models/
bundle exec rspec --debugger spec/models/

Irgendwelche Ideen, wie man rspec richtig ausführt? Ich bin auf Rails 3.0.5, Ruby 1.9.2, RSpec 2.5.1, Ruby-Debug19.

Danke, Justin.


1
Ich habe Pry verwendet, viel einfacher / besser. Nachdem Sie in Gemfile eingefügt und installiert haben, werfen Sie "binding.pry" an eine beliebige Stelle in Ihrer Spezifikation, führen Sie es aus und Sie rollen. Weitere Informationen finden Sie in der Bildschirmdarstellung.
Allyl Isocyanate

Pry ist ein großartiger Objekt-Explorer, aber (selbst mit Pry-Nav) hat es einfach nicht die Debugger-Funktionen, die das Debugger-Juwel hat. Ich wünschte, es wäre so, aber ich bin zurück zum Debugger gegangen.
Marnen Laibow-Koser

Antworten:


72

Sie erhalten, was Sie wollen, indem Sie require 'ruby-debug'oben in Ihre Spezifikation aufnehmen:

# spec/models/user_spec.rb
require 'spec_helper'
require 'ruby-debug'

describe User do
  it "should be valid" do
    debugger
    User.new.should be_valid
  end
end

Sie würden dann laufen rake specoder rspecwie gewohnt

HINWEIS: Ich bevorzuge jetzt Ruby 2.0+ und heble. Es ist so ziemlich der gleiche Prozess:

require 'spec_helper'
require 'pry-debugger'

describe User do
  it "should be valid" do
    binding.pry
    expect(User.new).to be_valid
  end
end

Außerdem füge ich im Allgemeinen Anforderungen wie diese in meine Datei spec_helper ein, damit der Pry-Debugger für alle meine Spezifikationen verfügbar ist.


Ein Hinweis hier: Meine Lösung funktioniert zum Hinzufügen von Ruby-Debugging zu einer bestimmten Spezifikationsdatei. Die Lösung von zetetic ermöglicht das Debuggen für das gesamte Projekt.
Christopher Maujean

2
Die Lösung funktioniert bei mir nicht. Ich bekomme: kann solche Datei nicht laden - Ruby-Debug (LoadError)
Felix Rabe

2
Betreff: die oben genannten. Muss die Gemfile-Zeile mit dem Ruby-Debug19-Gem auskommentieren. (Setzen Sie es in: test ,: Entwicklungsgruppen tatsächlich.) Funktioniert jetzt.
Felix Rabe

Hängt vom GEM ab, das Sie zum Debuggen verwenden. Ich benutze "pry-rails"und "pry-byebug"so würde ich require 'pry-rails'. Auch in der Gemfile müssen sie in dietest environment
Fabrizio Bertoglio

27

Sie können eine .rspecKonfigurationsdatei im Stammverzeichnis Ihres Projekts erstellen und die folgende Zeile einfügen:

--debug

2
invalid option: --debug (defined in ./.rspec)
Ian Vaughan

22

Für Ruby> = 1.9.2

Sie sollten das Debugger- Juwel anstelle von ruby-debug19 installieren. Es Sie verwenden Bündler , setzen Sie diese einfach in Ihre Gemfile:

group :test do
  gem "debugger"
end

Danach können Sie einfach setzen

rspec <3.0

--debug

rspec> = 3,0

-rdebugger

in Ihrer .rspecDatei

Dann kannst du einfach rennen

bundle exec rake spec

ohne zusätzliche Argumente. Sie müssen auch Ihren Quellcode nicht ändern (nicht einmal Ihren Testquellcode).


3
+1 und danke, dass du darauf hingewiesen hast. Es gibt keine Codeänderung, um den Debugger zu aktivieren , aber Sie müssen Ihren Testcode ändern, um den Debugger aufzurufen , genau wie oben in der ursprünglichen Frage gezeigt (fügen Sie eine debuggerAnweisung hinzu). Wenn Sie Ihren Test mit Spork ausführen, wird in der Spork-Konsole die Eingabeaufforderung rdb angezeigt, die nicht Ihre Eingabe wiedergibt. Scheint am einfachsten ohne Spork auszuführen.
Mark Berry

4
und wenn Sie byebug verwenden, dann wird es -rbyebug
mcr

16

Für Ruby 2.0 verwende ich byebug: https://github.com/deivid-rodriguez/byebug

gem 'byebug'

Code:

# spec/models/user_spec.rb
require 'spec_helper'
require 'byebug'

describe User do
  it "should be valid" do
    byebug
    User.new.should be_valid
  end
end

1
Aus irgendeinem Grund funktioniert diese Lösung nicht. Besteht den Test
Trip

@ Trip das ist interessant, vielleicht anstatt zu byebugversuchen hinzuzufügen debugger?
BotNet

9

Der beste Weg, den ich zum Debuggen in rSpec gefunden habe, besteht darin, Ihrer Datei 'spec_helper.rb' Folgendes hinzuzufügen

def logger
  Rails.logger
end

Sie können dann auf alle Protokollierungsmethoden in Ihren rSpec-Dateien zugreifen und beispielsweise die Tag-Protokollierung einbeziehen. Dies gilt natürlich für Rails 3 und höher. Wenn Sie vor Rails 3 etwas haben, fügen Sie stattdessen Folgendes hinzu:

def logger
  RAILS_DEFAULT_LOGGER
end

Sobald Sie Ihre Protokollierungsanweisungen eingerichtet haben, können Sie eingeben

tail -f log/test.log

in Ihrer Terminal-Shell, um Ihre Protokollierungsanweisungen zu überwachen, während die Tests ausgeführt werden.

Natürlich würden Sie in Ihrem eigentlichen rspec-Test etwas wie eingeben

logger.debug "#{1.class}"  # => Fixnum

Wenn Sie Ihre Debug-Anweisungen aus dem Rest Ihres Testprotokolls filtern möchten, stellen Sie Ihrer Debug-Anweisung einfach eine zufällige Zeichenfolge voran und leiten Sie die Ausgabe des Befehls tail an grep weiter.

Beispiel:

logger.debug "random_string #{1.class}"   # => Fixnum

tail -f log/test.log | grep random_string

Aktualisieren

Ich habe meine Meinung dazu geändert. Sie sollten pry, pry-doc und pry-debug, pry-debugger und pry-rail installieren. Verwenden Sie dann binding.pry in Ihrem Code, um eine interaktive Debugger-Konsole zu öffnen, die die Welt regiert!


1
Riesige +1, das ist ein wirklich toller Tipp
hoitomt

Dies beantwortete die Frage nicht.
Phatmann

phatmann, dies ist der korrekteste Weg in Rails 3, um die Anmeldung bei rspec-Tests zu ermöglichen. Nachdem Sie die Methode zu Ihrer Datei spec_helper.rb hinzugefügt haben, können Sie Debug-Anweisungen mithilfe von protokollieren. logger.debug "#{1.class}" Wenn Sie möchten, können Sie Ihrer Debug-Anweisung eine zufällige Zeichenfolge voranstellen und die Ausgabe des Befehls tail an grep weiterleiten, um Ihre Debug-Anweisungen zu filtern .
Ode

2
Downvoting. Das OP fragte nach Debugger-Haltepunkten, nicht nach Protokollierung (was in den Spezifikationen sowieso nicht die beste Idee ist).
Marnen Laibow-Koser

1
Downvoting aus demselben Grund wie @ MarnenLaibow-Koser. Kann eine nützliche Information sein, beantwortet aber nicht die eigentliche Frage des OP.
Denishaskin

4

Die beste und sauberste Option ist die Verwendung --requirein Ihrer .rspecDatei. Was Sie setzen, hängt davon ab, welchen Edelstein Sie zum Debuggen verwenden.

--color
--require pry
--require rails_helper

Diese entsprechen den Befehlszeilenoptionen (-d oder --debug ist jetzt veraltet).

Fühlen Sie sich frei zu verwenden debugger, ruby-debugoder pry(Hebelschienen in Ihrem Gemfile).

Für Ihr Gemfile:

group :test, :development do
  gem 'pry-rails'
end

Das Platzieren von require 'ruby-debug'etc. an der Spitze Ihrer Spezifikation ist einfach enger gekoppelt - zumal der am besten bewertete Kommentar hier vorschlägt, es einzeln in ALLE Ihre Dateien zu setzen. Mit der neuen .rspecDatei sollten Sie Ihre Dateien nicht mehr oben require 'spec_helper'oder require 'rails_helper'oben platzieren müssen.

Sie sind als implizite Befehlszeilenargumente sinnvoller.

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.