web-dev-qa-db-ja.com

仕様実行時のRuby警告の抑制

私は仕様を実行するときにRuby警告を抑制する方法を探しています。

spec spec/models/account_spec.rb

次のような警告が表示されます。

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

ActiveSupport警告の削除は、ActiveSupport::Deprecation.silenced = trueを使用すると非常に簡単です。

specコマンドの一部として既に初期化された定数警告を防ぐにはどうすればよいですか?または、そのような警告を抑制することができる別のspecファイルを作成することにより。これらの警告はgemファイルからのものであるため、これらのファイルに移動してKernel.silence_warningsで囲むことはできません。

注:警告の抑制は悪いことを理解しています。ただし、spec内からvimを1つ実行すると、警告によって画面が乱雑にならないのは素晴らしいことです。

44

仕様ラッパーの代わりにRubyコマンドで仕様を直接実行する場合は、-Wコマンドラインオプションを使用して警告を消すことができます。

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

あなたの場合:

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

警告を表示しないでください。

または、gemをロードする前に、つまり、environment.rb(またはRails 3)を使用している場合はapplication.rb)の先頭に$ VERBOSE = nilを設定できます。すべての警告を常に無効にします。

または、Railsを使用しているため、Bundlerを使用している場合は、Bundler.requireブロックの周りでKernel.silence_warningsを使用できるはずです。

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

より選択的に、特定のgemをロードするためだけに$ VERBOSEを設定します:

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

RUBYOPTの構文は

RUBYOPT="-W0" rspec

テスト済みRuby 2.1.xおよび2.14.x

43
Dingle

「RUBYOPT」環境変数を使用して、-W0をrspecに渡すこともできます。

RUBYOPT=W0 rspec spec/models/event_spec.rb

これにより、ディレクトリを渡すことで複数の仕様を実行できます

RUBYOPT=W0 rspec spec/models
16
Scott Patten

この post に関連して、 Railsガイドで説明されているように、作業中の環境に応じて非推奨の警告を管理できます

active_support.deprecation_behavior環境の非推奨レポートを設定します。デフォルトは:log fordevelopment:notifyforproductionおよび:stderrfortest。 config.active_support.deprecationに値が設定されていない場合、このイニシャライザーは現在の環境のconfig/environmentsファイルでこの行を構成するようユーザーに促します。値の配列に設定できます。

したがって、config/environments/test.rb:stderrfor:log

Rails.application.configure do
   ...
   # Print deprecation notices to the log file instead of console.
   config.active_support.deprecation = :log
   ...
end

この変更により、非推奨の警告がlog/test.logコンソール出力の代わり。

15
G. I. Joe

rspecには、使用できるタグオプションがあります。単純に/ dev/nullを使用しました。

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

.rspecファイルにこれがある場合は、削除します

--warnings

プロジェクトルートの.rspecファイルから。

実際には、おそらく警告を無視するべきではありませんが、警告をテストして、警告が本来あるべき場所で発生することを確認してください。

使用するのが最も簡単ではありませんが、次のようになります。

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

ここで見つけました 、そして私のユースケースのためにそれをテストしました、そしてそれは動作します(そしてもちろん、警告はコンソールから消えます)

0
Rudy Rigot

私のために働いた唯一の解決策は、私のconfig/environments/test.rbファイルの上に$VERBOSE = nilを追加することです

  Rails.application.configure do
   $VERBOSE = nil

偽の警告問題faker-1.9.6/lib/faker/default/number.rb:34があります。他のすべての警告を隠すため、ローカルで使用します。