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

159

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

Nathan Long
la source

Réponses:

186

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'informations sur GitHub . (toute personne ayant un meilleur lien, veuillez le conseiller)

(mettre à jour)

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

Depuis 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 de faire:

describe "Awesome feature", :awesome do

:awesomeest traité comme s'il l'était :awesome => true.

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

zététique
la source
Vous n'avez donc pas besoin de chercher, le lien direct vers la suggestion de zetetic est ici (pour Rspec 2.12) relishapp.com/rspec/rspec-core/v/2-12/docs/command-line/…
tir38
Nous avons ajouté une spécification à notre suite pour garantir que le code ne soit jamais fusionné avec le focus: vrai toujours dans le contrôle de code source. gist.github.com/jwg2s/7361603
jwg2s
@ jwg2s J'utilise un hook git pour bloquer les commits avec :focus, ce qui empêche également les indésirables comme « , binding.pry console.log», etc. de s'infiltrer dans la base de code.
zetetic
1
@Otheus non, je suis juste un fan :) J'aime vraiment ce qu'ils ont fait sur Relish, mais SO vient de lancer sa propre fonctionnalité de documentation, donc nous pouvons voir de la concurrence.
zetetic
1
Peut-être pouvez-vous m'indiquer la voie de la documentation qui décrit réellement l'utilisation et le comportement réel du rspecprogramme :) Parce que la doc Relish ne le fait pas.
Otheus
111

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"

J'utilise celui-là le plus.

Jan Minárik
la source
90

Dans votre spec_helper.rb:

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

puis 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 focaliser 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
Tom Chapin
la source
1
Dans rspec 3.5, c'est config.filter_run_when_matchinget cela pourrait fonctionner simplement en ajoutant :focusà l'exemple
Ali Ghanavatian
4
Si «focus: true» est commis accidentellement, votre CI réussira bien qu'il n'ait pas exécuté la plupart des tests.
zach
67

vous pouvez également transmettre 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 de contexte / description (exécutant toutes les spécifications de ce bloc)

Alex Lang
la source
50

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

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

Production:

Run options: include {:locations=>{"./spec/models/company_spec.rb"=>[81, 82, 83, 103]}}
Jonathon Batson
la source
C'est tellement d'or! 🙇🏾‍♂️
iGbanam
28

Comme vous pouvez le préfixer avec un RSpec 2.4 (je suppose) fou xà it, specify, describeet 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: trueet config.run_all_when_everything_filtered = truedans votre fichier spec_helper.rb.

Joshua Muheim
la source
5

Dans les nouvelles versions de RSpec, il est encore plus facile de configurer la prise en charge 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-matching

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

jwfearn
la source
3

Vous pouvez également exécuter des spécifications qui ont focus: truepar 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 lorsque vous supprimez focus: truetous les tests, exécutez à nouveau

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

Itsnikolay
la source
Est-ce spec/spec_helper.rbtoujours inclus? Ou seulement si aucune option n'est donnée? Pourquoi les modules de test ont require 'spec_helber'-ils et le code ci-dessus n'élimine-t-il pas la possibilité d'exécuter un seul test en spécifiant le fichier? Je ne trouve aucune documentation à ce sujet.
Otheus
1
spec_helper.rbest toujours inclus si vous avez --require spec_helperdans .rspecla racine du projet.
Kris
1

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

Avijit Majhi
la source