336 votes

Comment exécuter un seul test RSpec ?

J'ai le fichier suivant :

/spec/controllers/groups_controller_spec.rb

Quelle commande dans le terminal dois-je utiliser pour exécuter juste cette spécification et dans quel répertoire dois-je exécuter la commande ?

Mon fichier gem :

# Test ENVIRONMENT GEMS
group :development, :test do
    gem "autotest"
    gem "rspec-rails", "~> 2.4"
    gem "cucumber-rails", ">=0.3.2"
    gem "webrat", ">=0.7.2"
    gem 'factory_girl_rails'
    gem 'email_spec'
end

Dossier spécial :

require 'spec_helper'

describe GroupsController do
  include Devise::TestHelpers

  describe "GET yourgroups" do
    it "should be successful and return 3 items" do

      Rails.logger.info 'HAIL MARRY'

      get :yourgroups, :format => :json
      response.should be_success
      body = JSON.parse(response.body)
      body.should have(3).items # @user1 has 3 permissions to 3 groups
    end
  end
end

0 votes

Vous pouvez exécuter vos tests comme bundle exec rspec ./spec/controllers/groups_controller_spec.rb:6, il exécute ce test spécifique seulement. Plus d'informations ici : kolosek.com/rails-rspec-setup

1 votes

bundle exec rspec spec --help vous donnera la réponse :

532voto

apneadiving Points 64660

En général, je le fais :

rspec ./spec/controllers/groups_controller_spec.rb:42

42 représente la ligne du test que je veux exécuter.

EDIT1 :

Vous pouvez également utiliser des étiquettes. Voir ici .

EDIT 2 :

Essayez :

bundle exec rspec ./spec/controllers/groups_controller_spec.rb:42

0 votes

Merci d'avoir essayé cela, mais cela ne fonctionne pas lorsque je fais rake spec /spec/path...:XX J'obtiens l'erreur /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby -S bundle exec rspec . /spec/controllers/groups_controller_spec.rb ./spec/controllers/incoming_mails_controller_spec.rb ./spec/lib/mailing_job/mailingjob_find_reply_spec.rb ./spec/models/group_model_spec.rb ./spec/models/user_model_spec.rb

0 votes

Si j'essaie d'utiliser uniquement RSPEC, j'obtiens cette erreur : "$ rspec spec/controllers/groups_controller_spec.rb:19 /Library/Ruby/Gems/1.8/gems/bundler-1.0.0/lib/bundler/runtime.rb:27:in `setup' : Vous avez déjà activé rspec-core 2.6.2, mais votre Gemfile requiert rspec-core 2.6.0. Envisagez d'utiliser bundle exec. (Gem::LoadError) "

0 votes

Dans ce cas, vous pouvez essayer "bundle exec rspec spec/controllers/groups_controller_spec.rb:19".

72voto

Grant Birchmeier Points 4023

Avec Rake :

rake spec SPEC=path/to/spec.rb

(Le crédit va à cette réponse . Allez voter pour lui).

EDIT (merci à @cirosantilli) : Pour exécuter un scénario spécifique dans la spécification, vous devez fournir une correspondance de motif regex qui correspond à la description.

rake spec SPEC=path/to/spec.rb \
          SPEC_OPTS="-e \"should be successful and return 3 items\""

12 votes

C'est la meilleure réponse car elle utilise la commande 'rake spec' et non la commande 'rspec'. Cela signifie que la base de données de test est correctement réinitialisée à chaque fois (ce qui ne se produit pas si vous utilisez 'rspec...').

0 votes

Vous pouvez utiliser SPEC=path/to/spec.rb:42 pour exécuter le test sur le numéro de ligne donné, bien qu'il semble que toute it_behaves_like Les tests seront également exécutés (bug ?).

67voto

Douglas F Shearer Points 10422

Vous pouvez passer une expression rationnelle à la commande spec qui ne lancera que it correspondant au nom que vous avez fourni.

spec path/to/my_spec.rb -e "should be the correct answer"

Mise à jour de 2019 : Rspec2 est passé de la commande " spec " à la commande " rspec ".

0 votes

Merci j'ai essayé mais il y a une erreur avec : $ rake spec spec/controllers/incoming_mails_controller_spec.rb -e "should be successful and return 3 items" rake aborted ! (eval):1:in `standard_rake_options' : compile error (eval):1 : syntax error, unexpected tIDENTIFIER, expecting $end should be successful and return 3 items

0 votes

Mis à jour avec les idées du fichier de spécification actuel ?

0 votes

Si vous avez une erreur de compilation, votre spécification n'est pas valide ruby. Assurez-vous qu'il ne vous manque pas un do après un it , context ou describe déclaration.

31voto

Michael Durrant Points 30342

Il existe de nombreuses options :

rspec spec                           # All specs
rspec spec/models                    # All specs in the models directory
rspec spec/models/a_model_spec.rb    # All specs in the some_model model spec
rspec spec/models/a_model_spec.rb:nn # Run the spec that includes line 'nn'
rspec -e"text from a test"           # Runs specs that match the text
rspec spec --tag focus               # Runs specs that have :focus => true
rspec spec --tag focus:special       # Run specs that have :focus => special
rspec spec --tag focus ~skip         # Run tests except those with :focus => true

24voto

GlyphGryph Points 1501

Ma méthode préférée pour exécuter des tests spécifiques est légèrement différente. J'ai ajouté les lignes

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

Dans mon fichier spec_helper.

Maintenant, chaque fois que je veux exécuter un test spécifique (ou un contexte, ou une spécification), je peux simplement ajouter la balise "focus" à celui-ci, et exécuter mon test normalement - seul le(s) test(s) ciblé(s) s'exécutera. Si je supprime toutes les balises focus, le test run_all_when_everything_filtered se met en marche et exécute tous les tests comme d'habitude.

Ce n'est pas aussi rapide et facile que les options de la ligne de commande - il vous faut modifier le fichier du test que vous voulez exécuter. Mais cela vous donne beaucoup plus de contrôle, je pense.

0 votes

Je préfère nettement ce style, car j'exécute généralement les tests via Rubymine/intelliJ. J'aime aussi cette méthode car elle est similaire à l'utilisation de fit/xit dans jasmine / avec gulp.

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