Comment exécutez-vous un seul fichier de test / spécification dans RSpec?

282

Je veux pouvoir exécuter les tests d'un seul fichier de spécifications - pour le fichier que je modifie, par exemple. rake specexécute toutes les spécifications. Mon projet n'est pas un projet Rails, donc rake spec:docça ne marche pas.

Je ne sais pas si cela est important, mais voici ma structure de répertoires.

./Rakefile
./lib
./lib/cushion.rb
./lib/cushion
./lib/cushion/doc.rb
./lib/cushion/db.rb
./spec
./spec/spec.opts
./spec/spec_helper.rb
./spec/db_spec.rb
Jonathan Tran
la source

Réponses:

392

Ou vous pouvez ignorer le râteau et utiliser la commande 'rspec':

rspec path/to/spec/file.rb

Dans votre cas, je pense que tant que votre fichier ./spec/db_spec.rb comprend les aides appropriées, cela devrait fonctionner correctement.

Si vous utilisez une ancienne version de rspec, c'est:

spec path/to/spec/file.rb
Cameron Booth
la source
31
avec la nouvelle rspec, vous devez utiliser "rspec path / to / file.rb"
djburdick
3
Peut-être que je me trompe, mais je dois faire "bundle exec rspec path / to / spec / file.rb"
andrhamm
2
Si vous utilisez Rails, vous voudrez probablement exécuter vos spécifications à l'aide de Rake afin de vous assurer de partir d'une base de données vierge.
superluminaire du
@andrhamm, vous exécutez simplement vos spécifications dans le contexte de votre bundle. Cela est nécessaire si vous n'utilisez pas de jeux de gemmes (qui viennent par défaut avec rvm et sont une extension distincte de rbenv)
Caleb
6
Si vous souhaitez exécuter un seul test, vous ajoutez le numéro de ligne du début du test au fichier. Exemple: chemin rspec / vers / spec / fichier.rb: 455
runamok
201

L'invocation brute:

rake spec SPEC = spec / controllers / sessions_controller_spec.rb \
          SPEC_OPTS = "- e \" devrait se connecter avec le cookie \ ""

Maintenant, découvrez comment intégrer cela dans votre éditeur.

mislav
la source
1
Comme je l'ai dit, je ne suis pas dans les rails donc il n'y a pas de contrôleurs. Mais oui, "rake spec SPEC = file.rb" fonctionne. Merci! Je travaille actuellement sur l'intégration d'Emacs.
Jonathan Tran
5
Ne lancez pas le rakefile si vous pouvez l'éviter. Il faut des âges effrayants
Orion Edwards
2
J'ai changé la réponse acceptée, mais le paramètre SPEC_OPTS m'a également été utile.
Jonathan Tran
2
Voilà ce que j'appelle une bonne réponse. Pourquoi n'est-il pas marqué comme "Réponse"?
gmile
1
L'exécution directe des spécifications est souvent le meilleur choix, mais il y a de nombreuses fois où vous devez exécuter le râteau pour divers bits magiques dans un rakefile personnalisé
Nerdmaster
124

Cette question est ancienne, mais elle apparaît en haut de Google lors de la recherche de la façon d'exécuter un seul test. Je ne sais pas si c'est un ajout récent, mais pour exécuter un seul test à partir d'une spécification, vous pouvez faire ce qui suit:

rspec path/to/spec:<line number>

où -numéro de ligne- est un numéro de ligne qui contient une partie de votre test. Par exemple, si vous aviez une spécification comme:

1: 
2: it "should be awesome" do
3:   foo = 3
4:   foo.should eq(3)
5: end
6:

Disons qu'il est enregistré dans spec / models / foo_spec.rb. Ensuite, vous exécuteriez:

rspec spec/models/foo_spec.rb:2

et il exécuterait juste cette spécification. En fait, ce nombre pourrait être compris entre 2 et 5.

J'espère que cela t'aides!

juanpaco
la source
C'est intéressant, bien qu'il semble que cela ne fonctionne pas une fois que vous avez refactorisé vos spécifications en plusieurs fichiers (c'est-à-dire que vous ne pouvez les utiliser qu'avec le fichier _spec.rb principal, mais si aucun de vos exemples ne s'y trouve, il ne fonctionnera rien De plus, si vous essayez de l'utiliser pour un fichier qui n'est pas un fichier de spécification de niveau supérieur, cela ne fonctionnera pas non plus.)
Trejkaz
Je ne suis pas tout à fait. Qu'entendez-vous par «fichier de spécification de niveau supérieur»? Ma suite de tests est à peu près toujours divisée en plusieurs fichiers, et je peux toujours invoquer des tests dans un seul fichier en utilisant cette méthode. Voulez-vous dire avoir un fichier qui requireest vos autres fichiers de spécifications?
juanpaco
Je peux l'utiliser sur n'importe quel fichier à n'importe quel niveau sous le répertoire spec /. Je crois que Trejkaz est incorrect.
Michael Durrant
7
c'est génial et devrait être au top!
Tommaso Barbugli
4
J'utilise cela tout le temps, mais parfois vous voulez exécuter plusieurs tests à partir d'un seul fichier. Ensuite, vous pouvez taper tous les exemples comme ceci:rspec spec/models/foo_spec.rb:2:12:49
swilgosz
61

Vous pouvez également utiliser le texte réel du cas de test * e * xample avec -e!

Donc pour:

it "shows the plane arrival time"

vous pouvez utiliser

rspec path/to/spec/file.rb -e 'shows the plane arrival time'
./scripts/spec path/to/spec/file.rb -e 'shows the plane arrival time'

pas besoin de râteau ici.

tcurdt
la source
C'est tout ce dont vous avez besoin, sauf que "spec" doit être remplacé par "rspec" comme indiqué @bandhunt
Nicolas Wormser
19

de l'aide (spec -h):

-l, --line LINE_NUMBER           Execute example group or example at given line.
                                 (does not work for dynamically generated examples)

Exemple: spec spec / runner_spec.rb -l 162

boblin
la source
3
Dans les versions plus récentes de Rspec, vous ajoutez le numéro de ligne après deux points :selon la documentation et une réponse populaire.
dragon788
13

Si vous avez installé rspec en tant que plugin plutôt qu'en tant que gemme, alors vous n'aurez pas l' specexécutable.

Quoi qu'il en soit, il vous suffit d'exécuter le fichier à l'aide de ruby. Le code rspec est suffisamment intelligent pour exécuter les tests pour vous.

par exemple:

ruby myclass_spec.rb
Orion Edwards
la source
2
Est-il possible d'exécuter un test dans le fichier comme celui-ci?
Ian Vaughan
12

http://github.com/grosser/single_test vous permet de faire des trucs comme ..

rake spec:user          #run spec/model/user_spec.rb (searches for user*_spec.rb)
rake test:users_c       #run test/functional/users_controller_test.rb
rake spec:user:token    #run the first spec in user_spec.rb that matches /token/
rake test:user:token    #run all tests in user_test.rb that match /token/
rake test:last
rake spec:last
Zeke
la source
Il semble que la gemme n'ait pas été maintenue, le dernier commit remonte à 5 ans!
thegreendroid
10

Ruby 1.9.2 et Rails 3 ont un moyen simple d'exécuter un fichier spec:

  ruby -I spec spec / models / user_spec.rb

Explication:

  • rubyla commande a tendance à être plus rapide que la rakecommande
  • -I spec signifie "inclure le répertoire 'spec' lors de la recherche de fichiers"
  • spec/models/user_spec.rb est le fichier que nous voulons exécuter.
joelparkerhenderson
la source
Pouvez-vous exécuter un test dans ce fichier avec des options supplémentaires?
Ian Vaughan
10

Pour exécuter tous vos fichiers rspec:rspec

note: vous devez être à la racine de votre projet

Pour exécuter un fichier rspec:rspec 'path_to/spec.rb'

remarque: remplacez 'path_to / spec.rb' par votre chemin. Les guillemets sont facultatifs.

Pour exécuter un test rspec à partir d'un fichier:rspec 'path_to/spec.rb:7'

note:: 7 est le numéro de ligne où le test commence

nflauria
la source
5

J'avais du mal à faire fonctionner ces exemples, peut-être parce que le message est ancien et que les commandes ont changé?

Après quelques fouilles, j'ai trouvé que cela fonctionne:

spécification rspec / models / user_spec.rb

Cela ne fonctionnera que le fichier unique et fournit une sortie utile dans le terminal.

Greg Hemphill
la source
Cela a été mentionné dans un commentaire de la réponse acceptée. Oui, je pense que ce message est tellement ancien que le nom de la commande a changé.
Jonathan Tran
3

Alternativement, jetez un œil à l'autotest.

L'exécution de l'autotest dans une fenêtre de commande signifie que le fichier de spécifications sera exécuté chaque fois que vous l'enregistrerez. En outre, il sera exécuté chaque fois que le fichier que vous spécifiez est exécuté.

Par exemple, si vous avez un fichier de spécifications de modèle appelé person_spec.rb et un fichier de modèle qu'il spécifie appelé person.rb, chaque fois que vous enregistrez l'un de ces fichiers à partir de votre éditeur, le fichier de spécifications sera exécuté.

fatgeekuk
la source
3

Bien que de nombreuses bonnes réponses aient été écrites à cette question, aucune d'entre elles n'utilise l' approche Rspectags .

J'utilise des balises pour exécuter une ou plusieurs spécifications dans différents fichiers - uniquement celles liées à ma tâche de développement actuelle.

Par exemple, j'ajoute la balise "dev" avec la valeur "current":

it "creates an user", dev: :current do
  user = create(:user)
  expect(user.persisted?).to be_truthy
end

alors je cours

bundle exec rspec . --tag dev:current

Différentes balises / valeurs peuvent être définies dans des spécifications ou des groupes individuels.

Victor BV
la source
2

Disons que vous exécutez un test pour créer des tâches. Vous pouvez toujours exécuter ce code de tâche spécifique en utilisant le fichier crete_spec.rb comme ci-dessous.

      rspec/spec/features/controller/spec_file_name.rb

   Example:

   Creating  rspec spec/features/todos/create_spec.rb
   Editing   rspec spec/features/todos/edit_spec.rb
   Deleting  rspec spec/features/todos/destroy_spec.rb

Si vous souhaitez exécuter toutes les spécifications en un seul court métrage.

   rspec 

Si vous souhaitez exécuter toutes les spécifications dans un utilisateur de contrôleur spécifique, cela.

  rspec/spec/feaures/controller_name

  Example:   rspec/spec/features/todos

J'espère que cela vous donnera plus de compréhension!

Prabhakar Undurthi
la source