web-dev-qa-db-fra.com

Supprimer les avertissements Ruby lors de l'exécution des spécifications

Je cherche un moyen de supprimer les avertissements Ruby lorsque je lance mes spécifications.

spec spec/models/account_spec.rb

Je reçois des avertissements tels que:

DEPRECATION WARNING: ActiveSupport::Dependencies.load_paths is deprecated, ...
warning: already initialized constant SOME_CONSTANT_NAME

Supprimer l’avertissement ActiveSupport est assez facile avec ActiveSupport::Deprecation.silenced = true.

Comment puis-je empêcher les avertissements constants déjà initialisés dans le cadre de ma commande spec? Ou en créant un autre fichier spec pouvant supprimer de tels avertissements. N'oubliez pas que ces avertissements proviennent de fichiers gem, par conséquent, je ne peux pas entrer dans ces fichiers et les entourer de Kernel.silence_warnings.

Remarque: .__ Je comprends que la suppression des avertissements est mauvaise. Cependant, lorsque je lance une seule spec à partir de vim, ce serait bien si les avertissements ne surchargent pas mon écran.

39
Jey Balachandran

Si vous exécutez vos spécifications directement à l'aide de la commande Ruby au lieu du wrapper de spécification, vous pouvez utiliser l'option de ligne de commande -W pour désactiver les avertissements:

$ Ruby --help
[...]
  -W[level]       set warning level; 0=silence, 1=medium, 2=verbose (default)

Donc dans votre cas:

$ Ruby -W0 -Ispec spec/models/event_spec.rb

ne devrait vous montrer aucun avertissement.

Vous pouvez également définir $ VERBOSE = nil avant le chargement de vos pierres précieuses, c'est-à-dire en haut de votre environment.rb (ou application.rb si vous êtes sur Rails 3). Notez que cela désactive tous les avertissements tout le temps.

Ou, puisque vous utilisez Rails, vous devriez pouvoir utiliser Kernel.silence_warnings autour du bloc Bundler.require si vous utilisez Bundler:

Kernel.silence_warnings do
  Bundler.require(:default, Rails.env) if defined?(Bundler)
end

De manière plus sélective, définissez $ VERBOSE uniquement pour le chargement de gemmes spécifiques:

config.gem 'wellbehaving_gem'
original_verbosity = $VERBOSE
$VERBOSE = nil
config.gem 'noisy_gem_a'
$VERBOSE = original_verbosity
56
Jakob S

La syntaxe pour RUBYOPT est la suivante:

RUBYOPT="-W0" rspec

Testé en Ruby 2.1.x et 2.14.x

39
Dingle

Vous pouvez également utiliser la variable d'environnement "RUBYOPT" pour passer -W0 à rspec:

RUBYOPT=W0 rspec spec/models/event_spec.rb

Cela vous permet d'exécuter plusieurs spécifications en passant dans un répertoire.

RUBYOPT=W0 rspec spec/models
16
Scott Patten

En relation avec ce post , vous pouvez gérer les avertissements de dépréciation en fonction de l’environnement dans lequel vous travaillez, comme indiqué dans Guides Rails :

active_support.deprecation_behavior Configure le rapport de dépréciation pour environnements par défaut, : log pour développement, : notify pour production et : stderr pour test. Si aucune valeur n'est définie pour config.active_support.deprecation, cet initialiseur affichera alors Invite l'utilisateur de configurer cette ligne dans l'environnement actuel config/environnements fichier. Peut être défini sur un tableau de valeurs.

Il suffit donc de changer dans config/environments/test.rb la valeur : stderr pour : log

Rails.application.configure do
   ...
   # Print deprecation notices to the stderr.
   config.active_support.deprecation = :log
   ...
end

Et avec cela l'avertissement depecation sera dans le log/test.log à la place de la sortie de la console

15
G. I. Joe

rspec a une option de tag que vous pouvez utiliser - j'ai simplement utilisé/dev/null.

rspec spec --deprecation-out /dev/null
2
meditatingCybermind

Si vous avez cela dans votre fichier .rspec, supprimez

--warnings

à partir de votre fichier .rspec à la racine de votre projet.

1

En fait, vous ne devriez peut-être pas ignorer vos avertissements, mais les tester pour vous assurer qu'ils sont renvoyés là où ils sont censés être.

Ce n'est pas le plus facile à utiliser, mais cela ressemble à ceci:

obj.should_receive(:warn).with("Some Message")

Je l'ai trouvé ici , et l'ai testé pour mon cas d'utilisation, et cela fonctionne (et les avertissements disparaissent de la console, bien sûr)

0
Rudy Rigot