Ich habe 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 sind sich nicht sicher, wie lange dies noch verfügbar ist, aber es gibt eine Rspec-Konfiguration für die Lauffilterung. Fügen Sie dies jetzt zu Ihrem spec_helper.rb
Hinzu:
RSpec.configure do |config|
config.filter_run_when_matching :focus
end
Fügen Sie dann dem it
, context
oder describe
ein Fokus-Tag hinzu, um nur diesen Block auszuführen:
it 'runs a test', :focus do
...test code
end
RSpec-Dokumentation:
Normalerweise mache ich:
rspec ./spec/controllers/groups_controller_spec.rb:42
Wo 42
repräsentiert 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
Mit Rechen:
rake spec SPEC=path/to/spec.rb
(Verdienst geht an diese Antwort . Wählt ihn aus.)
[~ # ~] edit [~ # ~] (danke an @cirosantilli): Um ein bestimmtes Szenario innerhalb der Spezifikation auszuführen, müssen Sie ein angeben Regex-Musterübereinstimmung, die mit der Beschreibung übereinstimmt.
rake spec SPEC=path/to/spec.rb \
SPEC_OPTS="-e \"should be successful and return 3 items\""
Sie können einen regulären Ausdruck an den Befehl spec übergeben, der nur it
Blöcke ausführt, die dem von Ihnen angegebenen Namen entsprechen.
spec path/to/my_spec.rb -e "should be the correct answer"
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
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 Spezifikation) ausführen möchte, kann ich einfach das Tag "focus" hinzufügen und meinen Test wie gewohnt ausführen - nur die fokussierten Tests werden ausgeführt. Wenn ich alle Fokus-Tags entferne, wird das run_all_when_everything_filtered
startet und führt alle Tests wie gewohnt aus.
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 fühle, es gibt Ihnen viel mehr Kontrolle.
@apneadiving Antwort ist ein guter Weg, um dies zu lösen. Jetzt haben wir jedoch eine neue Methode in Rspec 3.3. Wir können einfach rspec spec/unit/baseball_spec.rb[#context:#it]
anstelle einer Zeilennummer. Entnommen aus hier:
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 Gruppe ausführen, die unter der 1. obersten Gruppe definiert sind, die in spec/unit/baseball_spec.rb definiert ist.
Also anstatt rspec spec/unit/baseball_spec.rb:42
wo es (Test in Zeile 42) der erste Test ist, können wir einfach 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.
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 TopicsControllerTest
übereinzustimmen.
Meine Klasse class TopicsControllerTest < ActionDispatch::IntegrationTest
Ausgabe :
Wenn Sie möchten, können Sie den regulären Ausdruck an die jeweilige Testmethode anpassen. \TopicsControllerTest#test_Should_delete\
Rails test -n /TopicsControllerTest#test_Should_delete/ -v
Für das Modell wird case nur in Zeile 5 ausgeführt
bundle exec rspec spec/models/user_spec.rb:5
Für Controller: Es wird nur case 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
Um bei allen Modellen zu laufen
bundle exec rspec spec/models
Zum Ausführen von case auf allen Controllern
bundle exec rspec spec/controllers
Alle Fälle ausführen
bundle exec rspec
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
Ich benutze diesen Schutzedelstein, um meinen Test automatisch auszuführen. Der Test wird nach dem Erstellen oder Aktualisieren von Vorgängen für die Testdatei ausgeführt.
https://github.com/guard/guard-test
oder in der Regel können Sie mit folgendem Befehl ausführen
rspec spec/controller/groups_controller_spec.rb
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
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 habe es satt, das zu tippen, also habe ich einen Alias erstellt, um "bundle exec rspec" zu "bersp" zu verkürzen.
'bundle exec' lädt die exakte Gem-Umgebung, die in Ihrer Gem-Datei angegeben ist: http://gembundler.com/
Rspec2 hat vom Befehl 'spec' zum Befehl 'rspec' gewechselt.