Wie führt man eine einzelne Test- / Spezifikationsdatei in RSpec aus?


282

Ich möchte in der Lage sein, die Tests einer einzelnen Spezifikationsdatei auszuführen - zum Beispiel für die eine Datei, die ich bearbeite. rake specführt alle Spezifikationen aus. Mein Projekt ist kein Rails-Projekt, rake spec:docfunktioniert also nicht.

Ich weiß nicht, ob das wichtig ist, aber hier ist meine Verzeichnisstruktur.

./Rakefile
./lib
./lib/cushion.rb
./lib/kissen
./lib/cushion/doc.rb
./lib/cushion/db.rb
./spec
./spec/spec.opts
./spec/spec_helper.rb
./spec/db_spec.rb

Antworten:


392

Oder Sie können Rake überspringen und den Befehl 'rspec' verwenden:

rspec path/to/spec/file.rb

In Ihrem Fall sollte es gut funktionieren, solange Ihre ./spec/db_spec.rb-Datei die entsprechenden Helfer enthält.

Wenn Sie eine ältere Version von rspec verwenden, ist dies:

spec path/to/spec/file.rb

31
mit der neuen rspec müssen Sie "rspec path / to / file.rb"
djburdick

3
Vielleicht mache ich es falsch, aber ich muss "bundle exec rspec path / to / spec / file.rb" machen
andrhamm

2
Wenn Sie Rails verwenden, möchten Sie Ihre Spezifikationen wahrscheinlich mit Rake ausführen, um sicherzustellen, dass Sie von einer leeren Datenbank ausgehen.
Superleuchte

@andrhamm, Sie führen Ihre Spezifikationen nur im Kontext Ihres Bundles aus. Dies ist erforderlich, wenn Sie keine Gemsets verwenden (die standardmäßig mit rvm geliefert werden und eine separate Erweiterung von rbenv darstellen)
Caleb

6
Wenn Sie nur einen Test ausführen möchten, hängen Sie die Zeilennummer des Teststarts an die Datei an. Beispiel: rspec path / to / spec / file.rb: 455
runamok

201

Der rohe Aufruf:

Rechenspezifikation SPEC = spec / controller / session_controller_spec.rb \
          SPEC_OPTS = "- e" sollte sich mit einem Cookie anmelden ""

Finden Sie nun heraus, wie Sie dies in Ihren Editor einbetten können.


1
Wie gesagt, ich bin nicht in Schienen, also gibt es keine Controller. Aber ja, "Rake Spec SPEC = file.rb" funktioniert. Vielen Dank! Ich arbeite gerade an der Emacs-Integration.
Jonathan Tran

5
Starten Sie das Rakefile nicht, wenn Sie es vermeiden können. Es dauert verdammt lange
Orion Edwards

2
Ich habe die akzeptierte Antwort geändert, aber der Parameter SPEC_OPTS war auch für mich hilfreich.
Jonathan Tran

2
Das nenne ich eine gute Antwort. Warum ist es nicht als "Antwort" markiert?
Meile

1
Das direkte Ausführen von Spezifikationen ist oft die beste Wahl, aber es gibt viele Fälle, in denen Sie Rake für verschiedene magische Teile in einem benutzerdefinierten Rakefile
ausführen

124

Diese Frage ist alt, wird jedoch bei der Suche nach der Ausführung eines einzelnen Tests oben in Google angezeigt. Ich weiß nicht, ob es sich um eine neue Erweiterung handelt, aber um einen einzelnen Test aus einer Spezifikation heraus auszuführen, können Sie Folgendes tun:

rspec path/to/spec:<line number>

Dabei ist -Zeilennummer- eine Zeilennummer, die einen Teil Ihres Tests enthält. Zum Beispiel, wenn Sie eine Spezifikation hatten wie:

1: 
2: it "should be awesome" do
3:   foo = 3
4:   foo.should eq(3)
5: end
6:

Angenommen, es wird in spec / models / foo_spec.rb gespeichert. Dann würden Sie laufen:

rspec spec/models/foo_spec.rb:2

und es würde nur diese eine Spezifikation ausführen. Tatsächlich kann diese Zahl zwischen 2 und 5 liegen.

Hoffe das hilft!


Dies ist interessant, obwohl es so aussieht, als würde es nicht funktionieren, wenn Sie Ihre Spezifikation in mehrere Dateien umgestalten (dh Sie können sie nur mit der Hauptdatei _spec.rb verwenden, aber wenn keines Ihrer Beispiele darin enthalten ist, wird nichts ausgeführt Auch wenn Sie versuchen, es für eine Datei zu verwenden, die keine Top-Level-Spezifikationsdatei ist, wird auch nichts ausgeführt.)
Trejkaz

Ich folge nicht ganz. Was meinst du mit "Top-Level-Spezifikationsdatei"? Meine Testsuite ist so gut wie immer auf mehrere Dateien verteilt, und mit dieser Methode kann ich Tests immer in einer einzigen Datei aufrufen. Meinen Sie damit, eine Datei zu haben, die requireIhren anderen Spezifikationsdateien entspricht?
Juanpaco

Ich kann dies für jede Datei auf jeder Ebene unter dem Verzeichnis spec / verwenden. Ich glaube, Trejkaz ist falsch.
Michael Durrant

7
Das ist großartig und sollte oben sein!
Tommaso Barbugli

4
Ich benutze dies die ganze Zeit, aber manchmal möchten Sie mehrere Tests aus einer Datei ausführen. Dann können Sie alle Beispiele wie rspec spec/models/foo_spec.rb:2:12:49
folgt eingeben

61

Sie können auch den eigentlichen Text des * e * xample-Testfalls mit verwenden -e!

So für:

it "shows the plane arrival time"

Sie können verwenden

rspec path/to/spec/file.rb -e 'shows the plane arrival time'
./scripts/spec path/to/spec/file.rb -e 'shows the plane arrival time'

Hier ist kein Rechen nötig.


Dies ist alles, was Sie brauchen, außer dass "spec" durch "rspec" ersetzt werden sollte, wie angegeben @bandhunt
Nicolas Wormser

19

von der Hilfe (spec -h):

-l, --line LINE_NUMBER           Execute example group or example at given line.
                                 (does not work for dynamically generated examples)

Beispiel: spec spec / running_spec.rb -l 162


3
In neueren Rspec-Versionen fügen Sie die Zeilennummer nach einem Doppelpunkt :gemäß der Dokumentation und einer beliebten Antwort hinzu.
Dragon788

13

Wenn Sie rspec als Plugin und nicht als Juwel installiert haben, verfügen Sie nicht über die specausführbare Datei.

In jedem Fall müssen Sie die Datei nur mit Ruby ausführen. Der rspec-Code ist clever genug, um die Tests für Sie auszuführen.

z.B:

ruby myclass_spec.rb

2
Ist es möglich, einen Test innerhalb der Datei wie folgt auszuführen?
Ian Vaughan

12

Mit http://github.com/grosser/single_test können Sie Dinge wie ... tun.

rake spec:user          #run spec/model/user_spec.rb (searches for user*_spec.rb)
rake test:users_c       #run test/functional/users_controller_test.rb
rake spec:user:token    #run the first spec in user_spec.rb that matches /token/
rake test:user:token    #run all tests in user_test.rb that match /token/
rake test:last
rake spec:last

Es scheint, dass der Edelstein nicht gepflegt wurde, das letzte Commit war vor 5 Jahren!
Thegreendroid

10

Ruby 1.9.2 und Rails 3 bieten eine einfache Möglichkeit, eine Spezifikationsdatei auszuführen:

  ruby -I spec spec / models / user_spec.rb

Erläuterung:

  • rubyBefehl ist in der Regel schneller als der rakeBefehl
  • -I spec bedeutet "das Verzeichnis 'spec' bei der Suche nach Dateien einschließen"
  • spec/models/user_spec.rb ist die Datei, die wir ausführen möchten.

Können Sie einen Test in dieser Datei mit einigen zusätzlichen Optionen ausführen?
Ian Vaughan

10

So führen Sie alle Ihre rspec-Dateien aus:rspec

Hinweis: Sie müssen sich im Stammverzeichnis Ihres Projekts befinden

So führen Sie eine rspec-Datei aus:rspec 'path_to/spec.rb'

Hinweis: Ersetzen Sie 'path_to / spec.rb' durch Ihren Pfad. Anführungszeichen optional.

So führen Sie einen rspec- Test aus einer Datei aus:rspec 'path_to/spec.rb:7'

Hinweis :: 7 ist die Zeilennummer, unter der der Test beginnt


5

Ich hatte Probleme, eines dieser Beispiele zum Laufen zu bringen, vielleicht weil der Beitrag alt ist und sich die Befehle geändert haben?

Nach einigem Stöbern fand ich Folgendes:

rspec spec / models / user_spec.rb

Dadurch wird nur die einzelne Datei ausgeführt und eine nützliche Ausgabe im Terminal bereitgestellt.


Dies wurde in einem Kommentar in der akzeptierten Antwort erwähnt. Ja, ich denke, dieser Beitrag ist so alt, dass sich der Befehlsname geändert hat.
Jonathan Tran

4

specky.vim


3

Alternativ können Sie sich auch den Autotest ansehen.

Wenn Sie den Autotest in einem Befehlsfenster ausführen, wird die Spezifikationsdatei jedes Mal ausgeführt, wenn Sie sie speichern. Außerdem wird es immer dann ausgeführt, wenn die von Ihnen angegebene Datei ausgeführt wird.

Wenn Sie beispielsweise eine Modellspezifikationsdatei mit dem Namen person_spec.rb und eine Modelldatei mit dem Namen person.rb haben, wird die Spezifikationsdatei ausgeführt, wenn Sie eine dieser Dateien in Ihrem Editor speichern.


3

Obwohl viele gute Antworten auf diese Frage geschrieben wurden, verwendet keine von ihnen den Rspec-tags Ansatz.

Ich verwende Tags, um eine oder mehrere Spezifikationen in verschiedenen Dateien auszuführen - nur solche, die sich auf meine aktuelle Entwicklungsaufgabe beziehen.

Zum Beispiel füge ich das Tag "dev" mit dem Wert "current" hinzu:

it "creates an user", dev: :current do
  user = create(:user)
  expect(user.persisted?).to be_truthy
end

dann renne ich

bundle exec rspec . --tag dev:current

In einzelnen Spezifikationen oder Gruppen können unterschiedliche Tags / Werte festgelegt werden.


2

Nehmen wir an, Sie führen einen Test zum Erstellen von Aufgaben aus. Sie können diesen spezifischen ToDo-Spezifikationscode jederzeit mit der Datei crete_spec.rb wie folgt ausführen.

      rspec/spec/features/controller/spec_file_name.rb

   Example:

   Creating  rspec spec/features/todos/create_spec.rb
   Editing   rspec spec/features/todos/edit_spec.rb
   Deleting  rspec spec/features/todos/destroy_spec.rb

Wenn Sie alle Spezifikationen in einem einzigen Kurzschluss ausführen möchten.

   rspec 

Wenn Sie alle Spezifikationen in einem bestimmten Controller ausführen möchten, verwenden Sie dies.

  rspec/spec/feaures/controller_name

  Example:   rspec/spec/features/todos

Hoffe es gibt dir mehr Verständnis!

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.