Search code examples
ruby-on-railsrubyrspecwarnings

Suppress Ruby warnings when running specs


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.


Solution

  • 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