我正在寻找一种在运行规范时抑制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
时,如果警告不会使我的屏幕混乱,那就太好了。
答案 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
”
-“警告:不建议将最后一个参数用作关键字参数;也许应在通话中添加**”
那么删除它们的唯一方法是:
$VERBOSE = nil
添加到config/environments/test.rb
RUBYOPT='-W0' bundle exec guard
我认为这不是删除所有这些警告的好建议,因此,稍后,在进行一些gem更新之后,我们应该再次删除这些行,以便例如在您自己的代码用法上获得正确的警告。