web-dev-qa-db-fra.com

Comment exécuter un seul test RSpec?

J'ai le fichier suivant:

/spec/controllers/groups_controller_spec.rb

Quelle commande dans le terminal est-ce que j’utilise pour exécuter uniquement cette spécification et dans quel répertoire dois-je exécuter la commande?

Mon fichier bijou:

# 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écification:

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
281
AnApprentice

Vous ne savez pas depuis combien de temps cela est disponible, mais il existe une configuration Rspec pour le filtrage de l'exécution - vous pouvez donc l'ajouter à votre spec_helper.rb:

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

Ajoutez ensuite une balise de focus à la it, context ou describe pour n’exécuter que 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

3
emc

D'habitude je 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 balises. Voir ici .

EDIT 2:

Essayer:

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

Avec râteau:

rake spec SPEC=path/to/spec.rb

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

EDIT (grâce à @cirosantilli): Pour exécuter un scénario spécifique dans la spécification, vous devez fournir une correspondance de motif d'expression régulière correspondant à la description.

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

Vous pouvez passer une expression rationnelle à la commande spec qui n'exécutera que les blocs it correspondant au nom que vous avez fourni.

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

Il y a beaucoup d'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
24
Michael Durrant

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

À 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, seul le ou les tests ciblés étant exécutés. Si je supprime toutes les balises de focus, le run_all_when_everything_filtered démarre et exécute tous les tests normalement.

Ce n'est pas aussi rapide et facile que les options de ligne de commande - cela nécessite que vous modifiiez le fichier pour le test que vous voulez exécuter. Mais cela vous donne beaucoup plus de contrôle, à mon avis.

23
GlyphGryph

La réponse @apneadiving est une manière élégante 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. Tiré de ici:

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

Par exemple, cette commande:

$ rspec spec/unit/baseball_spec.rb[1:2,1:4]… exécuterait les 2ème et 4ème exemples ou groupes définis dans 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:42 où il (test de la ligne 42) est le premier test, nous pouvons simplement faire rspec spec/unit/baseball_spec.rb[1:1] ou rspec spec/unit/baseball_spec.rb[1:1:1] en fonction de la manière dont le cas de test est imbriqué.

6
Ingo

Dans 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 la classe peut être utilisé pour correspondre au fichier souhaité TopicsControllerTest

Ma classe class TopicsControllerTest < ActionDispatch::IntegrationTest

Sortie:

enter image description here

Si vous le souhaitez, vous pouvez affiner l'expression régulière pour qu'elle corresponde à une méthode de test unique \TopicsControllerTest#test_Should_delete\

Rails test -n /TopicsControllerTest#test_Should_delete/ -v
3
Alupotha

Pour le modèle, la casse n’est exécutée que sur la ligne 5.

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

Pour le contrôleur: il ne traitera que le cas de la ligne 5

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

Pour le modèle de signal ou le contrôleur, supprimer le numéro de ligne ci-dessus

Pour exécuter des cas sur tous les modèles

bundle exec rspec spec/models

Pour exécuter le cas sur tous les contrôleurs

bundle exec rspec spec/controllers

Pour exécuter tous les cas

 bundle exec rspec 
1
Sandeep Kapil

à 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
1
Rudi

J'utilise cette gemme de garde pour exécuter mon test automatiquement. Il exécute le test après la création ou la mise à jour des opérations sur le fichier de test.

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

ou généralement vous pouvez utiliser la commande suivante

rspec spec/controllers/groups_controller_spec.rb

0
Rameshwar Vyevhare

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
Prabhakar

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

  bundle exec rspec spec/controllers/groups_controller_spec.rb 

devrait certainement travailler. Je me suis fatigué de taper que donc j'ai créé un alias pour raccourcir 'bundle exec rspec' à 'bersp'

'bundle exec' est chargé de manière à charger l'environnement gem spécifié dans votre fichier gem: http://gembundler.com/

Rspec2 est passé de la commande 'spec' à la commande 'rspec'.

0
MissingHandle