运行规范时禁止Ruby警告



我正在寻找一种在运行规范时抑制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"-"警告:不赞成使用最后一个参数作为关键字参数;可能**应该添加到调用">

然后,唯一的方法,这样删除他们所有是:

  1. $VERBOSE = nil添加到config/environments/test.rb
  2. 运行防护: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

相关内容

  • 没有找到相关文章

最新更新