运行规范时禁止Ruby警告

Jey*_*ran 46 ruby vim warnings rspec ruby-on-rails

当我运行我的规格时,我正在寻找一种方法来抑制Ruby警告.

spec spec/models/account_spec.rb
Run Code Online (Sandbox Code Playgroud)

我收到警告,例如:

DEPRECATION WARNING: ActiveSupport::Dependencies.load_paths is deprecated, ...
warning: already initialized constant SOME_CONSTANT_NAME
Run Code Online (Sandbox Code Playgroud)

删除ActiveSupport警告很容易ActiveSupport::Deprecation.silenced = true.

作为spec命令的一部分,如何防止已初始化的常量警告?或者通过创建另一个spec可以抑制此类警告的文件.请记住,这些警告来自gem文件,因此我无法进入这些文件并将其包围起来Kernel.silence_warnings.

注意: 我知道抑制警告很糟糕.但是,当我spec从内部运行单个内容时,vim如果警告不会使我的屏幕混乱,那将会很好.

Jak*_*b S 60

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

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

所以在你的情况下:

$ ruby -W0 -Ispec spec/models/event_spec.rb
Run Code Online (Sandbox Code Playgroud)

不应该向你显示任何警告.

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

或者,由于您使用的是Rails,如果您使用的是Bundler,则应该能够在Bundler.require块周围使用Kernel.silence_warnings:

Kernel.silence_warnings do
  Bundler.require(:default, Rails.env) if defined?(Bundler)
end
Run Code Online (Sandbox Code Playgroud)

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

config.gem 'wellbehaving_gem'
original_verbosity = $VERBOSE
$VERBOSE = nil
config.gem 'noisy_gem_a'
$VERBOSE = original_verbosity
Run Code Online (Sandbox Code Playgroud)


Din*_*gle 44

的语法RUBYOPT

RUBYOPT="-W0" rspec
Run Code Online (Sandbox Code Playgroud)

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

  • 也适用于 minitest:`RUBYOPT=W0 rake test TEST=test/hi_test.rb`。 (3认同)

G. *_*Joe 18

与此相关的帖子,你可以根据你的工作环境日折旧管理警告,如表示,轨道导向:

active_support.deprecation_behavior设置环境的弃用报告,默认为:log for development,:notify for production:stderr for test.如果没有为config.active_support.deprecation设置值,则此初始化程序将提示用户在当前环境的config/environments文件中配置此行 .可以设置为值数组.

所以只需更改config/environments/test.rb:stderr for :log

Rails.application.configure do
   ...
   # Print deprecation notices to the log file instead of console.
   config.active_support.deprecation = :log
   ...
end
Run Code Online (Sandbox Code Playgroud)

有了这个,depecation警告将log/test.log在控制台输出中

  • 这是唯一对我有用的解决方案 - 通过 -W0 什么也没做。 (2认同)

Sco*_*ten 17

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

RUBYOPT=W0 rspec spec/models/event_spec.rb
Run Code Online (Sandbox Code Playgroud)

这允许您通过传入目录来运行多个规范

RUBYOPT=W0 rspec spec/models
Run Code Online (Sandbox Code Playgroud)

  • 我不得不使用Dingle对Ruby 2.2.2的回答. (2认同)

小智 8

对我有用的唯一解决方案是添加到$VERBOSE = nil我的 config/environments/test.rb 文件顶部

  Rails.application.configure do
   $VERBOSE = nil
Run Code Online (Sandbox Code Playgroud)

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


小智 6

Warning[:deprecated] = false以后require "rails/all"config/application.rb作品很好地到处抑制这些警告。你可以做

Warning[:deprecated] = false if Rails.env.test?
Run Code Online (Sandbox Code Playgroud)

对于您的特定情况,或者更好 - 将其config/environments/test.rb放入 .


Len*_*ran 5

如果您的.rspec文件中有这个,请删除

--warnings
Run Code Online (Sandbox Code Playgroud)

从您.rspec的项目根目录中的文件。