Подавлять предупреждения Ruby при запуске спецификации - PullRequest
43 голосов
/ 08 апреля 2011

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

Ответы [ 8 ]

58 голосов
/ 08 апреля 2011

Если вы запускаете свои спецификации напрямую с помощью команды 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
43 голосов
/ 23 января 2015

Синтаксис для RUBYOPT:

RUBYOPT="-W0" rspec

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

16 голосов
/ 23 октября 2012

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

RUBYOPT=W0 rspec spec/models/event_spec.rb

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

RUBYOPT=W0 rspec spec/models
15 голосов
/ 20 мая 2016

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

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

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

2 голосов
/ 07 февраля 2017

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

rspec spec --deprecation-out /dev/null
1 голос
/ 03 января 2016

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

--warnings

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

0 голосов
/ 17 июля 2019

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

  Rails.application.configure do
   $VERBOSE = nil

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

0 голосов
/ 20 декабря 2013

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

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

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

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

...