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

Je pense qu’il y a un moyen d’exécuter uniquement des tests avec une étiquette donnée. Quelqu’un sait-il?

Il n’est pas facile de trouver la documentation, mais vous pouvez marquer 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 des options –tag pour plus de détails.

A partir de la v2.6, ce type de tag peut être exprimé encore plus simplement en incluant l’option de configuration treat_symbols_as_metadata_keys_with_true_values , qui vous permet de faire:

describe "Awesome feature", :awesome do

:awesome est traité comme s’il était :awesome => true .

Consultez également cette réponse pour savoir comment configurer RSpec pour exécuter automatiquement des tests «ciblés». Cela fonctionne particulièrement bien avec Guard .

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

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

Je l’utilise le plus souvent.

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 concentrer les tests avec ‘fit’ ou exclure avec ‘xit’, comme ceci:

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

alternativement, vous pouvez 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 contextuel / descriptif (exécutant toutes les spécifications de ce bloc)

Vous pouvez également enchaî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]}} 

A partir de RSpec 2.4 (je suppose), vous pouvez y append un préfixe f x , specify , describe et mettre en 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

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

Vous pouvez également exécuter des spécifications qui ont le 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 

Alors lancez simplement

 $ rspec 

et seul le test ciblé sera exécuté

puis quand vous supprimez focus: true tous les tests sont bien à nouveau exécutés

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

Dans les nouvelles versions de RSpec, il est encore plus facile de configurer le support:

 # 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-matching

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

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