Suppress Ruby warnings when running specs

59,185

Solution 1

If you run your specs directly with the ruby command instead of the spec wrapper, you can use the -W command line option to silence warnings:

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

So in your case:

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

should not show you any warnings.

Alternatively, you could set $VERBOSE=nil before your gems are loaded, ie at the top of your environment.rb (or application.rb if you're on Rails 3). Note that this disables all warnings all the time.

Or, since you are using Rails, you should be able to use Kernel.silence_warnings around the Bundler.require block if you're using Bundler:

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

More selectively, set $VERBOSE only for loading specific gems:

config.gem 'wellbehaving_gem'
original_verbosity = $VERBOSE
$VERBOSE = nil
config.gem 'noisy_gem_a'
$VERBOSE = original_verbosity

Solution 2

The syntax for RUBYOPT is

RUBYOPT="-W0" rspec

Tested in ruby 2.1.x and 2.14.x

Solution 3

Related with this post, you can manage deprecation warnings according to th environment in which you are working, as said in rails guides:

active_support.deprecation_behavior Sets up deprecation reporting for environments, defaulting to :log for development, :notify for production and :stderr for test. If a value isn't set for config.active_support.deprecation then this initializer will prompt the user to configure this line in the current environment's config/environments file. Can be set to an array of values.

So just change in config/environments/test.rb the value :stderr for :log

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

And with this change, the deprecation warnings will now be printed to the log/test.log instead of the console output.

Solution 4

You can also use the "RUBYOPT" environment variable to pass -W0 to rspec:

RUBYOPT=W0 rspec spec/models/event_spec.rb

This allows you to run multiple specs by passing in a directory

RUBYOPT=W0 rspec spec/models

Solution 5

Putting Warning[:deprecated] = false after require "rails/all" in config/application.rb works very well to suppress those warnings everywhere. You can do

Warning[:deprecated] = false if Rails.env.test?

for your particular case, or better yet - put it in config/environments/test.rb, but I'm not sure how well it is going to work since I belive some stuff is loaded before that.

Share:
59,185
Jey Balachandran
Author by

Jey Balachandran

Software Engineer focusing on Ruby, Rails and JavaScript.

Updated on January 18, 2020

Comments

  • Jey Balachandran
    Jey Balachandran over 4 years

    I'm looking for a way to suppress Ruby warnings when I run my specs.

    spec spec/models/account_spec.rb
    

    I receive warnings such as:

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

    Removing the ActiveSupport warning is quite easy with ActiveSupport::Deprecation.silenced = true.

    How do I prevent the already initialized constant warnings as part of my spec command? Or through creating another spec file that can suppress such warnings. Keep in mind that these warnings are from gem files, therefore I cannot go into those files and surround them with Kernel.silence_warnings.

    Note: I understand that suppressing warnings are bad. However, when I run a single spec from within vim it would be nice if the warnings didn't clutter my screen.

  • Jey Balachandran
    Jey Balachandran about 13 years
    Is there a way to check if -W0 was set from within the Ruby file?
  • Jakob S
    Jakob S about 13 years
    Yeah, just check the value of $VERBOSE. -W0 => nil, -W1 => false, -W2 => true
  • Richard Nienaber
    Richard Nienaber almost 9 years
    I had to use Dingle's answer for Ruby 2.2.2.
  • Evgenia Karunus
    Evgenia Karunus about 8 years
    and also works for minitest: RUBYOPT=W0 rake test TEST=test/hi_test.rb.
  • PhilT
    PhilT over 6 years
    Thanks, Adding $VERBOSE = nil to my Rakefile silenced warnings for me.
  • n13
    n13 almost 6 years
    This was the only solution that worked for me - passing -W0 did nothing.
  • brauliobo
    brauliobo almost 6 years
    there is no --warnings there obviously
  • Glenn
    Glenn over 3 years
    "export RUBYOPT=-W0 " worked for me as a general solution.