Suppress Ruby warnings when running specs

前端 未结 10 2180
野趣味
野趣味 2020-11-27 14:46

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:

相关标签:
10条回答
  • 2020-11-27 15:20

    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.

    0 讨论(0)
  • 2020-11-27 15:21

    If you have this in your .rspec file, remove

    --warnings
    

    from your .rspec file in your project root.

    0 讨论(0)
  • 2020-11-27 15:24

    The syntax for RUBYOPT is

    RUBYOPT="-W0" rspec
    

    Tested in ruby 2.1.x and 2.14.x

    0 讨论(0)
  • 2020-11-27 15:25

    If you're using guard for tests and Rails 6 and you get warnings such as: - "warning: FILE in eval may not return location in binding" - "warning: Capturing the given block using Proc.new is deprecated; use &block instead" - "warning: Using the last argument as keyword parameters is deprecated; maybe ** should be added to the call"

    Then the only way so remove them all is to:

    1. Add $VERBOSE = nil to config/environments/test.rb
    2. Run guard with: RUBYOPT='-W0' bundle exec guard

    I guess this is not good advice to remove all those warnings so later on, after a few gem updates, we should remove those lines again so that we get the right warnings on your own code usage for example.

    0 讨论(0)
  • 2020-11-27 15:26

    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
    
    0 讨论(0)
  • 2020-11-27 15:31

    Actually, perhaps you shouldn't ignore your warnings, but test them, to make sure they are fired where they're supposed to be.

    It's not the easiest to use, but it looks like this:

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

    I found it here, and tested it for my use case, and it works (and the warnings disappear from the console, of course)

    0 讨论(0)
提交回复
热议问题