187 votes

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

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

210voto

zetetic Points 29261

Il n'est pas facile de trouver la documentation, mais vous pouvez marquer les exemples avec un dièse. 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 . (si quelqu'un a un meilleur lien, merci de le signaler)

(mise à jour)

RSpec est maintenant superbement documenté ici . Voir le Option --tag pour plus de détails.

Depuis la version 2.6, ce type de balise peut être exprimé encore plus simplement en incluant l'option de configuration suivante treat_symbols_as_metadata_keys_with_true_values qui vous permet de faire :

describe "Awesome feature", :awesome do

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

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

0 votes

Pour que vous n'ayez pas à 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/

0 votes

Nous avons ajouté une spécification à notre suite pour garantir que le code ne soit jamais fusionné avec focus : true encore dans le contrôle de source. gist.github.com/jwg2s/7361603

0 votes

@jwg2s J'utilise un hook git pour bloquer les commits avec :focus qui empêche également les éléments indésirables tels que "binding.pry". , console.log`, etc. de se glisser dans la base de code.

129voto

Jan Minárik Points 1656

Vous pouvez exécuter tous les tests qui contiennent une chaîne spécifique avec Option --exemple (ou -e) :

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

C'est celui que j'utilise le plus.

108voto

Tom Chapin Points 336

Assurez-vous que RSpec est configuré dans votre spec_helper.rb de prêter attention à focus :

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

Ensuite, dans vos spécifications, ajoutez focus: true comme argument :

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

Vous pouvez également cibler les tests en modifiant it a fit (ou exclure les tests avec xit ), comme ceci :

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

2 votes

Dans rspec 3.5, il s'agit de config.filter_run_when_matching et cela pourrait fonctionner simplement en ajoutant :focus à l'exemple

5 votes

Si 'focus : true' est accidentellement validé, votre CI passera malgré le fait que la plupart des tests ne soient pas exécutés.

70voto

Alex Lang Points 732

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 vers un bloc contextuel/descriptif (qui exécute toutes les spécifications de ce bloc).

59voto

Jonathon Batson Points 302

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]}}

0 votes

C'est tellement doré !

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X