运行规范时禁止Ruby警告

时间:2011-04-08 06:53:29

标签: ruby-on-rails ruby vim rspec warnings

我正在寻找一种在运行规范时抑制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时,如果警告不会使我的屏幕混乱,那就太好了。

10 个答案:

答案 0 :(得分:57)

如果直接使用ruby命令而不是spec包装器运行规范,则可以使用-W命令行选项来静音警告:

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

所以在你的情况下:

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

不应该向您显示任何警告。

或者,您可以在加载gem之前设置$ VERBOSE = nil,即在environment.rb的顶部(如果您使用的是Rails 3,则设置为application.rb)。请注意,这会一直禁用所有警告。

或者,既然您正在使用Rails,那么如果您使用的是Bundler,则应该能够在Bundler.require块周围使用Kernel.silence_warning:

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

更有选择性地,仅为加载特定宝石设置$ VERBOSE:

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

答案 1 :(得分:42)

RUBYOPT的语法是

RUBYOPT="-W0" rspec

在ruby 2.1.x和2.14.x中测试

答案 2 :(得分:16)

您还可以使用“RUBYOPT”环境变量将-W0传递给rspec:

RUBYOPT=W0 rspec spec/models/event_spec.rb

这允许您通过传入目录

来运行多个规范
RUBYOPT=W0 rspec spec/models

答案 3 :(得分:15)

与此post相关,您可以根据您工作的环境管理弃用警告,如rails guides中所述:

  

active_support.deprecation_behavior 为其设置弃用报告   环境,默认:日志 开发:通知   测试生产:stderr 。如果未设置值   config.active_support.deprecation然后这个初始化程序将提示   用户在当前环境中配置此行   配置/环境文件。可以设置为值数组。

只需更改:log

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

通过此更改,弃用警告现在将打印到log/test.log而不是控制台输出。

答案 4 :(得分:4)

Warning[:deprecated] = false的{​​{1}}之后放置require "rails/all"可以很好地抑制这些警告。你可以做

config/application.rb

针对您的特定情况,或者更好的情况-将其放在Warning[:deprecated] = false if Rails.env.test? 中,但是我不确定它的效果如何,因为我相信在此之前已经加载了一些东西。

答案 5 :(得分:2)

rspec有一个你可以使用的标签选项 - 我只使用/ dev / null。

images

答案 6 :(得分:1)

如果您的.rspec文件中有此内容,请删除

--warnings

来自项目根目录中的.rspec文件。

答案 7 :(得分:0)

实际上,也许你不应该忽视你的警告,而是要对它们进行测试,以确保它们在应有的位置被解雇。

这不是最容易使用的,但它看起来像这样:

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

found it here,并根据我的用例对其进行了测试,并且它有效(当然,警告会从控制台中消失)

答案 8 :(得分:0)

唯一适用于我的解决方案是在我的config / environments / test.rb文件之上添加$VERBOSE = nil

  Rails.application.configure do
   $VERBOSE = nil

我遇到伪造的警告问题faker-1.9.6/lib/faker/default/number.rb:34。 在本地使用它,因为它会隐藏所有其他警告。

答案 9 :(得分:0)

如果您将防护用于测试和Rails 6并收到警告,例如: -“警告:评估中的 FILE 可能无法返回绑定中的位置” -“警告:不建议使用Proc.new捕获给定的块;而应使用&block” -“警告:不建议将最后一个参数用作关键字参数;也许应在通话中添加**”

那么删除它们的唯一方法是:

  1. $VERBOSE = nil添加到config/environments/test.rb
  2. 警卫:RUBYOPT='-W0' bundle exec guard

我认为这不是删除所有这些警告的好建议,因此,稍后,在进行一些gem更新之后,我们应该再次删除这些行,以便例如在您自己的代码用法上获得正确的警告。