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
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:
D'habitude je fais:
rspec ./spec/controllers/groups_controller_spec.rb:42
Où 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
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\""
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"
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
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.
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é.
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:
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
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
à 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
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
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
É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'.