Comment exécuter un seul test RSpec?


306

J'ai le fichier suivant:

/spec/controllers/groups_controller_spec.rb

Quelle commande dans le terminal dois-je utiliser pour exécuter uniquement 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

Fichier de spécifications:

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

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

bundle exec rspec spec --helpvous donnera la réponse:
Thomas Decaux

Réponses:


15

Je ne sais pas combien de temps cela est disponible, mais il existe une configuration Rspec pour le filtrage des exécutions - vous pouvez donc maintenant l'ajouter à votre spec_helper.rb:

RSpec.configure do |config|
  config.filter_run_when_matching :focus
end

Et puis ajoutez une balise focus au it, contextou describepour exécuter uniquement ce bloc:

it 'runs a test', :focus do
  ...test code
end

Documentation RSpec:

https://www.rubydoc.info/github/rspec/rspec-core/RSpec/Core/Configuration#filter_run_when_matching-instance_method


1
Cela nécessite une infrastructure changeante. Et n'oubliez pas de le changer en arrière. Je recommanderais de ne pas le faire et d'utiliser uniquement les rspeccommandes pour exécuter la spécification avec le paramètre approprié pour indiquer lequel
Michael Durrant

482

Habituellement, je fais:

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

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

EDIT1:

Vous pouvez également utiliser des balises. Voyez ici .

EDIT 2:

Essayer:

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

Merci d'avoir essayé que cela ne fonctionne pas lorsque j'effectue le 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
AnApprentice

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 : dans `setup ': Vous avez déjà activé rspec-core 2.6.2, mais votre Gemfile nécessite rspec-core 2.6.0. Pensez à utiliser le bundle exec. (Gem :: LoadError)"
AnApprentice

Vous pouvez essayer "bundle exec rspec spec / controllers / groups_controller_spec.rb: 19" dans ce cas
muffinista

bundle exec a fonctionné mais pourquoi? Est-ce un hack pour éviter cela?
AnApprentice

11
ce n'est pas un hack, il s'assure que vous utilisez la même version que vous avez déclarée dans votre gemfile. Dans votre cas, le simple a rspecéchoué car la version de votre système est plus récente que celle de votre gemfile.
apneadiving

67

Avec râteau:

rake spec SPEC=path/to/spec.rb

(Le mérite revient à cette réponse . Allez voter contre lui.)

EDIT (merci à @cirosantilli): Pour exécuter un scénario spécifique dans la spécification, vous devez fournir une correspondance de modèle d'expression régulière qui correspond à la description.

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

11
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 ...')
jpw

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

61

Vous pouvez transmettre une expression régulière à la commande spec qui exécutera uniquement les itblocs correspondant au nom que vous fournissez.

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

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


Merci d'avoir essayé, mais cela génère une erreur avec: $ rake spec spec / controllers / entrant_mails_controller_spec.rb -e "devrait réussir et renvoyer 3 éléments" rake abandonné! (eval): 1: dans `standard_rake_options ': erreur de compilation (eval): 1: erreur de syntaxe, tIDENTIFIER inattendu, s'attendant à ce que $ end réussisse et renvoie 3 éléments
AnApprentice

Mis à jour avec les idées réelles du fichier de spécifications?
AnApprentice

Si vous avez une erreur de compilation, votre spécification n'est pas un rubis valide. Assurez- vous que vous n'êtes pas un manque doaprès une it, contextou la describedéclaration.
Douglas F Shearer

1
C'est "spec", pas "rake spec".
muffinista

cela devrait être la bonne réponse, car un numéro de ligne est gravement faux - en tout cas
Eugen Mayer

27

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

23

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 y ajouter la balise "focus" et exécuter mon test normalement - seuls les tests focalisés s'exécuteront. Si je supprime toutes les balises de focus, les run_all_when_everything_filteredcoups de pied et exécute tous les tests normalement.

Ce n'est pas aussi rapide et facile que les options de ligne de commande - cela vous oblige à modifier le fichier pour le test que vous souhaitez exécuter. Mais cela vous donne beaucoup plus de contrôle, je pense.


Je préfère définitivement ce style, car je lance généralement des tests via Rubymine / intelliJ. J'aime aussi cette méthode car elle est similaire à l'utilisation de fit / xit dans jasmine / with
gulp

9

La réponse @apneadiving est une bonne façon de résoudre ce problème. Cependant, nous avons maintenant une nouvelle méthode dans Rspec 3.3. Nous pouvons simplement exécuter rspec spec/unit/baseball_spec.rb[#context:#it]au lieu d'utiliser un numéro de ligne. Extrait d' ici:

RSpec 3.3 introduit une nouvelle façon d'identifier les exemples [...]

Par exemple, cette commande:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4] … Exécuterait les 2e et 4e exemples ou groupes définis sous le 1er groupe de niveau supérieur défini dans spec / unit / baseball_spec.rb.

Ainsi, au lieu de faire rspec spec/unit/baseball_spec.rb:42où il (test à la ligne 42) est le premier test, nous pouvons simplement le faire rspec spec/unit/baseball_spec.rb[1:1]ou en rspec spec/unit/baseball_spec.rb[1:1:1]fonction de l'imbrication du cas de test.


5

Dans les rails 5,

J'ai utilisé cette méthode pour exécuter un seul fichier de test (tous les tests dans un seul fichier)

rails test -n /TopicsControllerTest/ -v

Le nom de classe peut être utilisé pour correspondre au fichier souhaité TopicsControllerTest

Ma classe class TopicsControllerTest < ActionDispatch::IntegrationTest

Production :

entrez la description de l'image ici

Si vous le souhaitez, vous pouvez modifier le regex pour l'adapter à une seule méthode de test \TopicsControllerTest#test_Should_delete\

rails test -n /TopicsControllerTest#test_Should_delete/ -v

4

Pour le modèle, il exécutera la casse sur la ligne numéro 5 uniquement

bundle exec rspec spec/models/user_spec.rb:5

Pour le contrôleur: il exécutera la casse sur la ligne numéro 5 uniquement

bundle exec rspec spec/controllers/users_controller_spec.rb:5

Pour le modèle de signal ou le contrôleur, supprimez le numéro de ligne d'en haut

Pour exécuter le boîtier sur tous les modèles

bundle exec rspec spec/models

Pour exécuter la casse sur tous les contrôleurs

bundle exec rspec spec/controllers

Pour exécuter tous les cas

 bundle exec rspec 

3

Exécutez les commandes depuis le répertoire racine de votre projet:

# run all specs in the project's spec folder
bundle exec rspec 

# run specs nested under a directory, like controllers
bundle exec rspec spec/controllers

# run a single test file
bundle exec rspec spec/controllers/groups_controller_spec.rb

# run a test or subset of tests within a file
# e.g., if the 'it', 'describe', or 'context' block you wish to test
# starts at line 45, run:
bundle exec rspec spec/controllers/groups_controller_spec.rb:45

1

à partir de rspec 2, vous pouvez utiliser les éléments suivants:

# in spec/spec_helper.rb
RSpec.configure do |config|
  config.filter_run :focus => true
  config.run_all_when_everything_filtered = true
end

# in spec/any_spec.rb
describe "something" do
  it "does something", :focus => true do
    # ....
  end
end

0

Étant donné que vous êtes sur un projet rails 3 avec rspec 2, à partir du répertoire racine de rails:

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

devrait certainement fonctionner. je suis fatigué de taper ça donc j'ai créé un alias pour raccourcir 'bundle exec rspec' en 'bersp'

'bundle exec' est pour qu'il charge l'environnement de gemme exact spécifié dans votre fichier gem: http://gembundler.com/

Rspec2 est passé de la commande «spec» à la commande «rspec».


0

J'utilise ce joyau de garde pour exécuter automatiquement mon test. Il exécute le test après avoir créé ou mis à jour des opérations sur le fichier de test.

https://github.com/guard/guard-test

ou généralement vous pouvez exécuter en utilisant la commande suivante

rspec spec / controllers / groups_controller_spec.rb


0

Vous pouvez faire quelque chose comme ça:

 rspec/spec/features/controller/spec_file_name.rb
 rspec/spec/features/controller_name.rb         #run all the specs in this controller

0

Vous pouvez utiliser

 rspec spec/controllers/groups_controller_spec.rb:<line_number>

le numéro de ligne doit être le numéro de ligne des lignes «décrire» ou «it» afin qu'il exécute les tests présents dans ce bloc particulier. à la place, il exécutera toutes les lignes à côté de line_number.

vous pouvez également créer un bloc avec un nom personnalisé, puis exécuter uniquement ces blocs.


0

Une autre erreur courante consiste à avoir ou à mettre à niveau une ancienne application Rails vers Rails 5+ et à placer require 'spec_helper'en haut de chaque fichier de test. Cela devrait être changé en require 'rails_helper'. Si vous voyez un comportement différent entre la tâche de râteau ( rake spec) et lorsque vous exécutez une seule spécification ( rspec path/to/spec.rb), c'est une raison courante

la meilleure solution est de

1) assurez-vous que vous utilisez require 'rails_helper'en haut de chacun de vos fichiers de spécifications - pas l'ancien style require 'spec_helper' 2) utilisez la rake spec SPEC=path/to/spec.rbsyntaxe

le style plus ancien, rspec path/to/spec.rbje pense, devrait être considéré comme hors de mode par la communauté en ce moment en 2020 (mais bien sûr, vous le ferez fonctionner, autres considérations mises à part)

En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.