Wie führe ich nur bestimmte Tests in Rspec aus?

159

Ich denke, es gibt eine Möglichkeit, nur Tests mit einem bestimmten Label durchzuführen. Weiß jemand Bescheid?

Nathan Long
quelle

Antworten:

186

Es ist nicht einfach, die Dokumentation zu finden, aber Sie können Beispiele mit einem Hash versehen. Z.B.

# spec/my_spec.rb
describe SomeContext do
  it "won't run this" do
    raise "never reached"
  end

  it "will run this", :focus => true do
    1.should == 1
  end
end

$ rspec --tag focus spec/my_spec.rb

Weitere Infos zu GitHub . (Jeder mit einem besseren Link, bitte beraten)

(aktualisieren)

RSpec ist hier jetzt hervorragend dokumentiert . Weitere Informationen finden Sie im Abschnitt --tag option .

Ab Version 2.6 kann diese Art von Tag noch einfacher ausgedrückt werden, indem die Konfigurationsoption hinzugefügt wird treat_symbols_as_metadata_keys_with_true_values, mit der Sie Folgendes tun können:

describe "Awesome feature", :awesome do

wo :awesomewird behandelt, als ob es wäre :awesome => true.

In dieser Antwort erfahren Sie auch, wie Sie RSpec so konfigurieren, dass automatisch "fokussierte" Tests ausgeführt werden. Dies funktioniert besonders gut mit Guard .

zetetisch
quelle
Damit Sie nicht suchen müssen, finden Sie hier (für Rspec 2.12) den direkten Link zum Vorschlag von zetetic. Relishapp.com/rspec/rspec-core/v/2-12/docs/command-line/…
tir38
Wir haben unserer Suite eine Spezifikation hinzugefügt, um sicherzustellen, dass Code niemals mit dem Fokus zusammengeführt wird: true, noch in der Quellcodeverwaltung. gist.github.com/jwg2s/7361603
jwg2s
@ jwg2s Ich verwende einen Git-Hook, um Commits zu blockieren :focus, wodurch auch verhindert wird, dass unerwünschte Ereignisse wie 'binding.pry , console.log ' usw. in die Codebasis eindringen.
Zetetic
1
@Otheus nein, ich bin nur ein Fan :) Ich mag wirklich, was sie auf Relish gemacht haben, aber SO hat gerade eine eigene Dokumentationsfunktion gestartet, so dass wir vielleicht eine Konkurrenz sehen.
Zetetic
1
Vielleicht können Sie mich auf die Dokumentation hinweisen, die tatsächlich die Verwendung und das tatsächliche Verhalten des rspecProgramms beschreibt :) Weil das Relish-Dokument dies nicht tut.
Otheus
111

Sie können alle Tests, die eine bestimmte Zeichenfolge enthalten, mit der Option --example (oder -e) ausführen :

rspec spec/models/user_spec.rb -e "User is admin"

Ich benutze das am meisten.

Jan Minárik
quelle
89

In Ihrem spec_helper.rb:

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

und dann auf Ihre Spezifikationen:

it 'can do so and so', focus: true do
    # This is the only test that will run
end

Sie können Tests auch mit 'fit' fokussieren oder mit 'xit' ausschließen, wie folgt:

fit 'can do so and so' do
    # This is the only test that will run
end
Tom Chapin
quelle
1
In rspec 3.5 ist es config.filter_run_when_matchingund es könnte funktionieren, indem man einfach :focuszum Beispiel hinzufügt
Ali Ghanavatian
4
Wenn 'focus: true' versehentlich festgeschrieben wird, besteht Ihr CI, obwohl die meisten Tests nicht ausgeführt werden.
Zach
67

Alternativ können Sie die Zeilennummer übergeben: rspec spec/my_spec.rb:75- Die Zeilennummer kann auf eine einzelne Spezifikation oder einen Kontext- / Beschreibungsblock verweisen (wobei alle Spezifikationen in diesem Block ausgeführt werden).

Alex Lang
quelle
50

Sie können auch mehrere Zeilennummern mit einem Doppelpunkt verbinden:

$ rspec ./spec/models/company_spec.rb:81:82:83:103

Ausgabe:

Run options: include {:locations=>{"./spec/models/company_spec.rb"=>[81, 82, 83, 103]}}
Jonathon Batson
quelle
Das ist so Gold! 🙇🏾‍♂️
iGbanam
28

Ab RSpec 2.4 (ich glaube) können Sie einen prepend foder xzu it, specify, describeund context:

fit 'run only this example' do ... end
xit 'do not run this example' do ... end

http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#fit-class_method http://rdoc.info/github/rspec/rspec-core/RSpec/Core/ExampleGroup#xit-class_method

Seien Sie sicher, config.filter_run focus: trueund config.run_all_when_everything_filtered = truein Ihrem zu haben spec_helper.rb.

Joshua Muheim
quelle
3

Sie können auch Spezifikationen ausführen, die focus: truestandardmäßig vorhanden sind

spec / spec_helper.rb

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

Dann einfach laufen

$ rspec

und es wird nur ein fokussierter Test ausgeführt

Wenn Sie dann focus: truealle Tests entfernt haben, führen Sie sie erneut aus

Weitere Informationen: https://www.relishapp.com/rspec/rspec-core/v/2-6/docs/filtering/inclusion-filters

itsnikolay
quelle
Ist spec/spec_helper.rbimmer enthalten? Oder nur wenn keine Optionen angegeben sind? Warum haben Testmodule require 'spec_helber'die Möglichkeit, einen einzelnen Test durch Angabe der Datei auszuführen, und schließt der obige Code nicht aus? Ich kann keine Dokumentation dazu finden.
Otheus
1
spec_helper.rbwenn Sie ist immer enthalten --require spec_helperin .rspecder Projektwurzel.
Kris
0

Sie können als laufen rspec spec/models/user_spec.rb -e "SomeContext won't run this".

Avijit Majhi
quelle