Wie führe ich einen einzelnen RSpec-Test durch?


306

Ich habe die folgende Datei:

/spec/controllers/groups_controller_spec.rb

Welchen Befehl im Terminal verwende ich, um nur diese Spezifikation auszuführen, und in welchem ​​Verzeichnis führe ich den Befehl aus?

Meine Edelsteindatei:

# Test ENVIRONMENT GEMS
group :development, :test do
    gem "autotest"
    gem "rspec-rails", "~> 2.4"
    gem "cucumber-rails", ">=0.3.2"
    gem "webrat", ">=0.7.2"
    gem 'factory_girl_rails'
    gem 'email_spec'
end

Spezifikationsdatei:

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  describe "GET yourgroups" do
    it "should be successful and return 3 items" do

      Rails.logger.info 'HAIL MARRY'

      get :yourgroups, :format => :json
      response.should be_success
      body = JSON.parse(response.body)
      body.should have(3).items # @user1 has 3 permissions to 3 groups
    end
  end
end

Sie können Ihre Tests wie bundle exec rspec ./spec/controllers/groups_controller_spec.rb:6 ausführen. Es wird nur dieser spezielle Test ausgeführt. Weitere Infos hier: kolosek.com/rails-rspec-setup
Nesha Zoric

bundle exec rspec spec --helpIch gebe Ihnen die Antwort:
Thomas Decaux

Antworten:


15

Sie sind sich nicht sicher, wie lange dies verfügbar ist, aber es gibt eine Rspec-Konfiguration für die Lauffilterung. Jetzt können Sie diese zu Ihrer spec_helper.rb:

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

Und dann einen Fokus - Tag der hinzufügen it, contextoder describenur diesen Block zu laufen:

it 'runs a test', :focus do
  ...test code
end

RSpec-Dokumentation:

https://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#filter_run_when_matching-instance_method


1
Dies erfordert eine Änderung der Infrastruktur. Und daran denken, es wieder zu ändern. Ich würde empfehlen, dies nicht zu tun und nur die rspecBefehle zu verwenden, um die Spezifikation mit dem entsprechenden Parameter auszuführen, um anzugeben, welcher
Michael Durrant

482

Normalerweise mache ich:

rspec ./spec/controllers/groups_controller_spec.rb:42

Wo 42steht die Zeile des Tests, den ich ausführen möchte.

EDIT1:

Sie können auch Tags verwenden. Siehe hier .

EDIT 2:

Versuchen:

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42

Vielen Dank versucht, dass es nicht funktioniert, wenn ich spec /spec/path...:XX Rake Ich erhalte den Fehler /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -S Bundle exec rspec ./spec/controllers/groups_controller_spec.rb ./spec/controllers/incoming_mails_controller_spec.rb ./spec/lib/mailing_job/mailingjob_find_reply_spec.rb ./spec/models/group_model_spec.rb ./spec/models/user_model_spec.rb
AnApprentice

Wenn ich versuche, nur RSPEC zu verwenden, wird folgende Fehlermeldung angezeigt: "$ rspec spec / controller / groups_controller_spec.rb: 19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27 : in `setup ': Sie haben rspec-core 2.6.2 bereits aktiviert, aber Ihre Gemfile benötigt rspec-core 2.6.0. Erwägen Sie die Verwendung von bundle exec. (Gem :: LoadError)"
AnApprentice

In diesem Fall können Sie "bundle exec rspec spec / controller / groups_controller_spec.rb: 19" versuchen
muffinista

Bundle Exec hat funktioniert, aber warum? Ist das ein Hack, um das zu vermeiden?
AnApprentice

11
Es ist kein Hack, es stellt sicher, dass Sie dieselbe Version verwenden, die Sie in Ihrer Gem-Datei deklariert haben. In Ihrem Fall ist das bloße rspecfehlgeschlagen, weil die Version auf Ihrem System aktueller ist als die in Ihrer Gem-Datei.
Apneadiving

67

Mit Rechen:

rake spec SPEC=path/to/spec.rb

(Gutschrift geht auf diese Antwort . Geh und stimme ihn ab.)

EDIT (dank @cirosantilli): Um ein bestimmtes Szenario innerhalb der Spezifikation laufen, haben Sie eine RegexMuster Spiel zu liefern , die die Beschreibung passt.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""

11
Dies ist die überlegene Antwort, da der Befehl 'rake spec' und nicht der Befehl 'rspec' verwendet wird. Das bedeutet, dass die Testdatenbank jedes Mal ordnungsgemäß neu initialisiert wird (was nicht der Fall ist, wenn Sie 'rspec ...' verwenden)
jpw

Sie können SPEC=path/to/spec.rb:42den Test mit der angegebenen Zeilennummer ausführen, obwohl anscheinend auch alle it_behaves_likeTests ausgeführt werden (Fehler?).
mgold

61

Sie können dem Befehl spec einen regulären Ausdruck übergeben, der nur itBlöcke ausführt, die dem von Ihnen angegebenen Namen entsprechen.

spec path/to/my_spec.rb -e "should be the correct answer"

Update 2019: Rspec2 wechselte vom Befehl 'spec' zum Befehl 'rspec'.


Danke, ich habe das versucht, aber es ist ein Fehler mit: $ rake spec spec / controller / incoming_mails_controller_spec.rb -e "sollte erfolgreich sein und 3 Elemente zurückgeben" Rake abgebrochen! (eval): 1: in `standard_rake_options ': Kompilierungsfehler (eval): 1: Syntaxfehler, unerwarteter TIDENTIFIER, Erwartung, dass $ end erfolgreich sein sollte und 3 Elemente zurückgeben
AnApprentice

Mit den aktuellen Ideen für Spezifikationsdateien aktualisiert?
AnApprentice

Wenn Sie einen Kompilierungsfehler haben, ist Ihre Spezifikation kein gültiger Ruby. Stellen Sie sicher , fehlen Sie kein donach einer it, contextoder describeErklärung.
Douglas F Shearer

1
Es ist "spec", nicht "Rake spec".
Muffinista

Dies sollte die richtige Antwort sein, in Bezug auf eine Zeilennummer ist ernsthaft falsch - auf jeden Fall
Eugen Mayer

27

Es gibt viele Möglichkeiten:

rspec spec                           # All specs
rspec spec/models                    # All specs in the models directory
rspec spec/models/a_model_spec.rb    # All specs in the some_model model spec
rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn'
rspec -e"text from a test"           # Runs specs that match the text
rspec spec --tag focus               # Runs specs that have :focus => true
rspec spec --tag focus:special       # Run specs that have :focus => special
rspec spec --tag focus ~skip         # Run tests except those with :focus => true

23

Meine bevorzugte Methode zum Ausführen bestimmter Tests ist etwas anders - ich habe die Zeilen hinzugefügt

  RSpec.configure do |config|
    config.filter_run :focus => true
    config.run_all_when_everything_filtered = true
  end

Zu meiner spec_helper-Datei.

Wenn ich jetzt einen bestimmten Test (oder Kontext oder eine bestimmte Spezifikation) ausführen möchte, kann ich einfach das Tag "Fokus" hinzufügen und meinen Test wie gewohnt ausführen - nur die fokussierten Tests werden ausgeführt. Wenn ich alle Fokus-Tags entferne, werden alle run_all_when_everything_filteredTests wie gewohnt gestartet und ausgeführt.

Es ist nicht ganz so schnell und einfach wie die Befehlszeilenoptionen - Sie müssen die Datei für den Test bearbeiten, den Sie ausführen möchten. Aber ich denke, es gibt dir viel mehr Kontrolle.


Ich bevorzuge diesen Stil definitiv, da ich normalerweise Tests über Rubymine / IntelliJ durchführe. Ich mag diese Methode auch, weil sie der Verwendung von fit / xit in Jasmin / mit gulp
ähnelt

9

@apneadiving Antwort ist eine gute Möglichkeit, dies zu lösen. Jetzt haben wir jedoch eine neue Methode in Rspec 3.3. Wir können einfach laufen, rspec spec/unit/baseball_spec.rb[#context:#it]anstatt eine Zeilennummer zu verwenden. Von hier genommen:

RSpec 3.3 führt eine neue Methode zur Identifizierung von Beispielen ein [...]

Zum Beispiel dieser Befehl:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] … Würde das 2. und 4. Beispiel oder die 2. Gruppe ausführen, die unter der 1. Gruppe der obersten Ebene definiert sind, die in spec / unit / baseball_spec.rb definiert ist.

Anstatt also zu tun, rspec spec/unit/baseball_spec.rb:42wo es (Test in Zeile 42) der erste Test ist, können wir es einfach tun rspec spec/unit/baseball_spec.rb[1:1]oder rspec spec/unit/baseball_spec.rb[1:1:1]abhängig davon, wie verschachtelt der Testfall ist.


5

In Schienen 5,

Ich habe auf diese Weise eine einzelne Testdatei ausgeführt (alle Tests in einer Datei).

rails test -n /TopicsControllerTest/ -v

Der Klassenname kann verwendet werden, um mit der gewünschten Datei übereinzustimmen TopicsControllerTest

Meine Klasse class TopicsControllerTest < ActionDispatch::IntegrationTest

Ausgabe :

Geben Sie hier die Bildbeschreibung ein

Wenn Sie möchten, können Sie den regulären Ausdruck so anpassen, dass er mit einer einzelnen Testmethode übereinstimmt \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v

4

Für das Modell wird case nur in Zeile 5 ausgeführt

bundle exec rspec spec/models/user_spec.rb:5

Für Controller: Der Fall wird nur in Zeile 5 ausgeführt

bundle exec rspec spec/controllers/users_controller_spec.rb:5

Entfernen Sie für das Signalmodell oder den Controller die Zeilennummer von oben

Fall auf allen Modellen ausführen

bundle exec rspec spec/models

Fall auf allen Controllern ausführen

bundle exec rspec spec/controllers

Alle Fälle ausführen

 bundle exec rspec 

3

Führen Sie die Befehle aus dem Stammverzeichnis Ihres Projekts aus:

# run all specs in the project's spec folder
bundle exec rspec 

# run specs nested under a directory, like controllers
bundle exec rspec spec/controllers

# run a single test file
bundle exec rspec spec/controllers/groups_controller_spec.rb

# run a test or subset of tests within a file
# e.g., if the 'it', 'describe', or 'context' block you wish to test
# starts at line 45, run:
bundle exec rspec spec/controllers/groups_controller_spec.rb:45

1

Ab rspec 2 können Sie Folgendes verwenden:

# in spec/spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end

# in spec/any_spec.rb
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end

0

Vorausgesetzt, Sie befinden sich in einem Rails 3-Projekt mit rspec 2, aus dem Rails-Stammverzeichnis:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

sollte auf jeden Fall funktionieren. Ich hatte es satt, das zu tippen, also habe ich einen Alias ​​erstellt, um 'bundle exec rspec' auf 'bersp' zu kürzen.

'bundle exec' ist so, dass es die genaue Gem-Umgebung lädt, die in Ihrer Gem-Datei angegeben ist: http://gembundler.com/

Rspec2 wechselte vom Befehl 'spec' zum Befehl 'rspec'.


0

Ich benutze dieses Schutzjuwel, um meinen Test automatisch auszuführen. Der Test wird ausgeführt, nachdem Vorgänge für die Testdatei erstellt oder aktualisiert wurden.

https://github.com/guard/guard-test

oder normalerweise können Sie mit folgendem Befehl ausführen

rspec spec / controller / groups_controller_spec.rb


0

Sie können so etwas tun:

 rspec/spec/features/controller/spec_file_name.rb
 rspec/spec/features/controller_name.rb         #run all the specs in this controller

0

Sie können verwenden

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

Die Zeilennummer sollte die Zeilennummer der Zeilen "beschreiben" oder "es" sein, damit Tests ausgeführt werden, die in diesem bestimmten Block vorhanden sind. Stattdessen werden alle Zeilen neben line_number ausgeführt.

Sie können auch einen Block mit einem benutzerdefinierten Namen erstellen und dann nur diese Blöcke ausführen.


0

Ein weiterer häufiger Fehler besteht darin, eine ältere Rails-App noch auf Rails 5+ zu haben oder aktualisiert zu haben und sie require 'spec_helper'oben in jeder Testdatei zu platzieren. Dies sollte sich in ändern require 'rails_helper'. Wenn zwischen der Rake-Task ( rake spec) und dem Ausführen einer einzelnen Spezifikation ( rspec path/to/spec.rb) ein unterschiedliches Verhalten auftritt , ist dies ein häufiger Grund

Die beste Lösung ist zu

1) Stellen Sie sicher, dass Sie require 'rails_helper'oben in jeder Ihrer Spezifikationsdateien verwenden - nicht im älteren Stil. require 'spec_helper' 2) Verwenden Sie dierake spec SPEC=path/to/spec.rb Syntax

Der ältere Stil sollte rspec path/to/spec.rbmeiner Meinung nach von der Community zu diesem Zeitpunkt im Jahr 2020 als nicht in Mode sein (aber natürlich werden Sie ihn zum Laufen bringen, abgesehen von anderen Überlegungen).

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.