我正在寻找一种在运行规范时抑制Ruby警告的方法。
spec spec/models/account_spec.rb
我收到以下警告:
DEPRECATION WARNING: ActiveSupport::Dependencies.load_paths is deprecated, ...
warning: already initialized constant SOME_CONSTANT_NAME
使用ActiveSupport::Deprecation.silenced = true
可以很容易地删除ActiveSupport
警告。
如何防止已初始化的常量警告作为spec
命令的一部分?或者通过创建另一个可以抑制此类警告的spec
文件。请记住,这些警告来自gem文件,因此我不能进入这些文件并用Kernel.silence_warnings
包围它们。
注意:我知道压制警告是不好的。然而,当我从vim
中运行单个spec
时,如果警告没有扰乱我的屏幕,那就太好了。
RUBYOPT
的语法是
RUBYOPT="-W0" rspec
在ruby 2.1.x和2.14.x 中测试
如果直接使用ruby命令而不是规范包装器运行规范,则可以使用-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.requise块周围使用Kernel.silence_warnings
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
与本文相关,您可以根据您工作的环境管理折旧警告,如rails guides:中所述
active_support.dedeposition_behavior设置的折旧报告环境,默认为:log用于开发,:通知生产和:stderr用于测试。如果没有为设置值config.active_support.depreaction,则此初始值设定项将提示在当前环境中配置此行的用户配置/环境文件。可以设置为值的数组。
因此,只需在config/environments/test.rb
中更改:stderr的值:log
Rails.application.configure do
...
# Print deprecation notices to the log file instead of console.
config.active_support.deprecation = :log
...
end
通过此更改,弃用警告现在将打印到log/test.log
,而不是控制台输出。
您还可以使用"RUBYOPT"环境变量将-W0传递给rspec:
RUBYOPT=W0 rspec spec/models/event_spec.rb
这允许您通过传入目录来运行多个规范
RUBYOPT=W0 rspec spec/models
唯一对我有效的解决方案是在我的config/environments/test.rb文件上添加$VERBOSE = nil
Rails.application.configure do
$VERBOSE = nil
我是faker警告问题faker-1.9.6/lib/faker/default/number.rb:34
。在本地使用它,因为它会隐藏所有其他警告。
在config/application.rb
中将Warning[:deprecated] = false
放在require "rails/all"
之后可以很好地抑制所有地方的警告。你可以做
Warning[:deprecated] = false if Rails.env.test?
对于您的特定情况,或者更好的是,将其放在config/environments/test.rb
中,但我不确定它的效果如何,因为我相信在此之前已经加载了一些东西。
如果您的.rspec
文件中有这个,请删除
--warnings
从项目根目录中的.rspec
文件。
rspec有一个可以使用的标记选项——我只使用了/dev/null。
rspec spec --deprecation-out /dev/null
如果您在测试和Rails6中使用guard,则会收到以下警告:-"警告:eval中的FILE可能不会返回绑定中的位置"-"警告:不赞成使用Proc.new捕获给定块;请改用&block
"-"警告:不赞成使用最后一个参数作为关键字参数;可能**应该添加到调用">
然后,唯一的方法,这样删除他们所有是:
- 将
$VERBOSE = nil
添加到config/environments/test.rb
- 运行防护:
RUBYOPT='-W0' bundle exec guard
我想这不是删除所有这些警告的好建议,所以稍后,在几次gem更新后,我们应该再次删除这些行,这样我们就可以获得关于您自己的代码使用的正确警告。
实际上,也许你不应该忽视你的警告,而是应该测试它们,以确保它们在应该的地方被激发。
它不是最容易使用的,但看起来像这样:
obj.should_receive(:warn).with("Some Message")
我在这里找到了它,并针对我的用例进行了测试,它有效(当然,警告也会从控制台中消失(
对于单个规格:
around do |example|
before = ActiveSupport::Deprecation.silenced
ActiveSupport::Deprecation.silenced = true
example.run
ActiveSupport::Deprecation.silenced = before
end