Techioz Blog

テスト用に Ruby Logger 出力をキャプチャする

概要

次のような Ruby クラスがあります。

require 'logger'
class T
  def do_something
    log = Logger.new(STDERR)
    log.info("Here is an info message")
  end
end

そして、テストスクリプトには次のような行があります。

#!/usr/bin/env ruby

gem "minitest"
require 'minitest/autorun'

require_relative 't'

class TestMailProcessorClasses < Minitest::Test
  def test_it
    me = T.new

    out, err = capture_io do
      me.do_something
    end

    puts "Out is '#{out}'"
    puts "err is '#{err}'"
  end
end

このテストを実行すると、out と err の両方が空の文字列になります。 (端末上の) stderr にメッセージが出力されているのがわかります。 Logger と Capture_io をうまく連携させる方法はありますか?

私は Ruby on Rails ではなく、ストレートな Ruby 環境にいます。

解決策

魔法は、capture_subprocess_io を使用することです

 out, err = capture_subprocess_io do
     do_stuff
 end