web-dev-qa-db-fra.com

Comment exécuter uniquement des tests spécifiques dans Rspec?

Je pense qu'il y a un moyen de n'exécuter que des tests avec une étiquette donnée. Quelqu'un sait?

141
Nathan Long

Il n'est pas facile de trouver la documentation, mais vous pouvez baliser des exemples avec un hachage. Par exemple.

# 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

Plus d'infos sur GitHub . (toute personne avec un meilleur lien, s'il vous plaît aviser)

(mettre à jour)

RSpec est maintenant superbement documenté ici . Voir la section --tag option pour plus de détails.

À partir de la v2.6, ce type de balise peut être exprimé encore plus simplement en incluant l'option de configuration treat_symbols_as_metadata_keys_with_true_values, qui vous permet d'effectuer

describe "Awesome feature", :awesome do

:awesome est traité comme s'il s'agissait de :awesome => true.

Voir également cette réponse pour savoir comment configurer RSpec pour qu'il exécute automatiquement des tests "ciblés". Cela fonctionne particulièrement bien avec Guard .

169
zetetic

Vous pouvez exécuter tous les tests contenant une chaîne spécifique avec l'option - exemple (ou -e) :

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

Je l'utilise le plus.

99
Jan Minárik

Dans votre spec_helper.rb:

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

et ensuite sur vos spécifications:

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

Vous pouvez également vous concentrer sur les tests avec 'fit' ou exclure avec 'xit', comme suit:

fit 'can do so and so' do
    # This is the only test that will run
end
71
Tom Chapin

vous pouvez également passer le numéro de ligne: rspec spec/my_spec.rb:75 - le numéro de ligne peut pointer vers une seule spécification ou un bloc context/describe (exécuter toutes les spécifications de ce bloc)

62
Alex Lang

Vous pouvez également chaîner plusieurs numéros de ligne avec deux points:

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

Sortie:

Run options: include {:locations=>{"./spec/models/company_spec.rb"=>[81, 82, 83, 103]}}
42
Jonathon Batson

En RSpec 2.4 (je suppose), vous pouvez ajouter un f ou x à it, specify, describe et 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_methodhttp://rdoc.info/github/rspec/rspec-core/ RSpec/Core/ExampleGroup # xit-class_method

Assurez-vous d'avoir config.filter_run focus: true et config.run_all_when_everything_filtered = true dans votre spec_helper.rb.

24
Joshua Muheim

Aussi, vous pouvez exécuter des spécifications qui ont focus: true par défaut

spec/spec_helper.rb

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

Puis lancez simplement

$ rspec

et seul le test ciblé sera exécuté

puis lorsque vous supprimez focus: true tous les tests bien être exécuté à nouveau

Plus d'informations: https://www.relishapp.com/rspec/rspec-core/v/2-6/docs/filtering/inclusion-filters

3
itsnikolay

Vous pouvez exécuter en tant que rspec spec/models/user_spec.rb -e "SomeContext won't run this".

0
Avijit Majhi

Dans les versions plus récentes de RSpec, il est encore plus facile de configurer le support fit:

# spec_helper.rb

# PREFERRED
RSpec.configure do |c|
  c.filter_run_when_matching :focus
end

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

Voir:

https://relishapp.com/rspec/rspec-core/docs/filtering/filter-run-when-menginging

https://relishapp.com/rspec/rspec-core/v/3-7/docs/configuration/run-all-when-everything-filtred

0
jwfearn