Вы можете временно перенаправить 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
, поэтому вы также можете проверить, что выводится, если вам нужно.