Отключить вывод консольной задачи rake в Minitest - PullRequest
0 голосов
/ 29 октября 2018

У меня есть задача rake, которая выводит данные на консоль. Этот вывод полезен для отслеживания хода выполнения и достигается с помощью puts, например, так:

task :clean => :environment do
  # Some code
  puts 'Doing work'
end

У меня есть тест для этой задачи, написанный на Minitest, и он выдает тот же вывод консоли, как если бы он вызывался вручную. Это портит экран «зеленые точки», когда я запускаю весь набор тестов для проекта.

Есть ли возможность отключить вывод консоли (эффект оператора puts) в тестовой среде? Необязательно, есть ли другой способ отображения сообщений при запуске задачи вручную, которые можно скрыть в тестовой среде.

Я исследовал возможность замены puts на Rails.logger.info. Это может быть настроено для каждой среды, но выводит выходные данные в журнал, а не в окно терминала, где запускается задача.

1 Ответ

0 голосов
/ 29 октября 2018

Вы можете временно перенаправить STDOUT на /dev/null и восстановить его впоследствии.

original_stdout = $stdout
$stdout = File.open(File::NULL, 'w')

# ... do your tests ...

$stdout = original_stdout

Другим подходом было бы поместить код, который в данный момент находится непосредственно в вашей задаче Rake, в объект некоторого описания и использовать внедрение зависимостей со значением по умолчанию. Например:

# your rake file
task :clean => :environment do
  MyTaskObject.new.call
end

# my_task_object.rb
class MyTaskObject
  attr_reader :io

  def initialize(io = $stdout)
    @io = io
  end

  def call
    # ...actions
    io.puts "output"
    # more actions...
  end
end

Тогда вместо того, чтобы запускать задачу rake непосредственно в ваших тестах, вы можете протестировать объект и передать свой собственный объект ввода-вывода вместо stdout:

test '...' do
  io = StringIO.new

  MyTaskObject.new(io).call

  # assert here as usual
end

Одним из преимуществ этого подхода является то, что использование StringIO позволит вам опрашивать io.string, поэтому вы также можете проверить, что выводится, если вам нужно.

...