Comment obtenir rspec-2 pour donner la trace complète associée à un échec de test?


96

En ce moment, si j'exécute ma suite de tests en utilisant, rake specj'obtiens une erreur:

1) SegmentsController GET 'index' devrait fonctionner
   Échec / Erreur: obtenir 'index'
   méthode non définie `locale 'pour #
   # ./spec/controllers/segments_controller_spec.rb:14:
      dans `bloc (3 niveaux) dans '

C'est normal car j'ai une erreur :)

Le problème est que la trace n'est pas très utile. Je sais que ça a éclaté segments_controller_spec.rb, ligne 14, mais c'est là que j'appelle le test:

### segments_controller_spec.rb:14
get 'index'

Je préférerais avoir le saut de ligne réel et la trace complète, pas la partie dans le dossier spec.

Courir avec --tracen'aide pas.


2
Vérifiez spin.atomicobject.com/2010/12/28/rspec-backtrace-filtering~~V~~singular~~3rd Il y a un moyen de changer le filtrage par défaut RSpec Backtrace
Bohdan

Réponses:


244

Vous devez exécuter rspec avec -boption pour voir les backtraces complètes


9
Je ne comprends pas, ni celle-ci ni la réponse acceptée ne vous permettent de revenir plus loin de votre fichier de spécifications. Ou cela ne fonctionne pas seulement pour moi o_O
janko-m

et fwiw si vous utilisez rspec avec spork et guard, vous pouvez créer un fichier .rspec et y ajouter -b pour obtenir la sortie lorsque vous exécutez votre suite de tests
shicholas

C'est en effet la bonne réponse - vous n'avez pas besoin du backtrace complet (qui inclut des trucs comme les rails, rspec et autres gemmes) presque tout le temps - la seule fois où vous en avez besoin est de déboguer ou de comprendre quelque chose causé par le gem lui-même. Donc, tenez-vous-en aux modèles de nettoyage de trace par défaut et utilisez -b dans le cas étrange lorsque vous en avez besoin.
Asfand Qazi

Il n'a pas montré les informations de trace de pile sur l'erreur elle-même. Au contraire, il a montré la trace de la pile de la gemme rspec
Aleksandrus

Fonctionne également pour RSpec 3
Koen.

29

Une autre alternative (plus simple) consiste à modifier le .rspecfichier et à ajouter l' backtraceoption. Cela devrait ressembler un peu à ceci:

--colour
--backtrace

Cela vous donnera la trace complète. J'espère que cela t'aides.


Oui! c'est exactement ce dont j'avais besoin. trace de la pile à l'erreur réelle et non à la pile de spécifications.
DiegoSalazar

Je pense que l'orthographe appropriée est color. Je pense que si vous l'épelez, colourune blague de Monty Python pourrait apparaître
WattsInABox

2
Approprié si vous venez d'Amérique. Au Royaume-Uni, ils écrivent en couleur et les gens de rspec sont si gentils de permettre les deux;)
nathanvda

2
C'est jeté une clé dans le capot!
œufs d'oeuf

3

Cela fonctionnera également:

# rails_helper.rb
RSpec.configure do |config|
  config.full_backtrace = true
end

2

Une autre approche consiste à effacer tous les modèles d'exclusion de backtrace dans spec_helper.rb. Je aime cette solution la plus que je suis capable de garder tous les paramètres RSpec en un seul endroit et se débarrasser de .rspec fileou explicite --backtracedans .travis.yml.

# spec_helper.rb
RSpec.configure do |config|
  config.backtrace_exclusion_patterns = []
end

Ne semble pas avoir cette option dans rspec 2.x.
Michael Yagudaev

1

Je ne sais pas comment faire apparaître l'erreur du contrôleur dans rspec. Parfois, il apparaît, mais je ne sais pas dans quelles conditions il apparaît. Voici un moyen de voir l'erreur assez rapidement:

Ouvrez une autre session de terminal et exécutez:

tail -f log/test.log

Revenez ensuite à la session du terminal et exécutez uniquement la spécification qui avait l'erreur:

bin/rspec -b spec/requests/posts/index_spec.rb

Revenez à la fin du journal et vous devriez voir l'erreur, avec un peu de chance sans trop d'autres éléments qui l'entourent (car vous avez exécuté le test échoué par lui-même).


0

Une autre option quand tout le reste échoue est simplement d'ajouter un bloc de secours et d'imprimer la pile try ou d'y ajouter une instruction de liaison pry et d'utiliser show-stack.

rescue Exception => e
  puts ""
  puts e.backtrace
  puts ""

C'est parfois la meilleure option. Assurez-vous simplement de le supprimer une fois qu'il fonctionne. Il devrait envelopper l'endroit où vous attendez l'erreur. Peut-être mettez le bloc beginet rescuecomme instruction externe de la méthode d'action du contrôleur. Ou utilisez rescue_from.
Benjamin Atkin

1
@bat oui, c'est une tentative de dernier recours et comme @bat l'a dit, il doit être supprimé une fois que vous l'avez compris. Pensez toujours à faire votre git diffavant de vous engager, cela sauvera votre bacon.
Michael Yagudaev
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.