Запретить предупреждения Ruby при запуске спецификаций

Я ищу способ подавить предупреждения 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, было бы неплохо, если бы предупреждения не загромождали мой экран.

Ответ 1

Если вы запускаете свои спецификации напрямую с помощью команды ruby ​​вместо оболочки спецификации, вы можете использовать опцию командной строки -W, чтобы отключить предупреждения:

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

Итак, в вашем случае:

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

не должен показывать вам никаких предупреждений.

В качестве альтернативы вы можете установить $VERBOSE = nil перед загрузкой ваших драгоценных камней, то есть в верхней части вашего environment.rb(или application.rb, если вы находитесь на Rails 3). Обратите внимание, что это все время отключает все предупреждения.

Или, поскольку вы используете Rails, вы должны иметь возможность использовать Kernel.silence_warnings в блоке Bundler.require, если вы используете Bundler:

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

Ответ 2

Синтаксис RUBYOPT -

RUBYOPT="-W0" rspec

Протестировано в ruby ​​2.1.x и 2.14.x

Ответ 3

Вы также можете использовать переменную окружения "RUBYOPT" для передачи -W0 в rspec:

RUBYOPT=W0 rspec spec/models/event_spec.rb

Это позволяет запускать несколько спецификаций путем передачи в каталог

RUBYOPT=W0 rspec spec/models

Ответ 4

В связи с этим постом вы можете управлять предупреждениями об устаревании в зависимости от среды, в которой вы работаете, как сказано в руководствах по rails:

active_support.deprecation_behavior Устанавливает отчетность устаревания для сред, по умолчанию: журнал для развития: оповещать для производства и: STDERR для испытания. Если значение не установлено для config.active_support.deprecation, этот инициализатор предложит пользователю настроить эту строку в файле config/environment текущей среды. Может быть установлен в массив значений.

Так что просто измените в 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 вместо вывода на консоль.

Ответ 5


rspec имеет параметр тега, который вы можете использовать - я просто использовал /dev/null.

rspec spec --deprecation-out /dev/null

Ответ 6

Если у вас есть это в вашем файле .rspec, удалите

--warnings

из вашего .rspec файла в корне вашего проекта.

Ответ 7

Собственно, возможно, вы не должны игнорировать свои предупреждения, но проверяйте их, чтобы убедиться, что они запущены там, где они должны быть.

Это не самая простая в использовании, но она выглядит так:

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

I нашел его здесь и протестировал его для моего варианта использования, и он работает (и предупреждения исчезают с консоли, конечно)

Ответ 8

См. Https://github.com/jeremyevans/ruby-warning/, который позволяет игнорировать конкретные предупреждения по типу и файлу, в котором они произошли (например, только в драгоценных камнях).

Ответ 9

Единственное решение, которое мне помогло, - это добавить $VERBOSE = nil поверх моего файла config/environment/test.rb.

  Rails.application.configure do
   $VERBOSE = nil

У меня проблемы с предупреждением о faker-1.9.6/lib/faker/default/number.rb:34. Используйте его локально, потому что он скрывает все другие предупреждения.