Posted at

Rubyで標準出力をナニしたい時に書いたコード

More than 5 years have passed since last update.

unit testで本当に期待した値が標準出力に出力されているかテストしたいという謎のニーズがあったときに書きました。

他に良い方法があったら教えてください。

rubyでは標準出力の$stdoutを自由に書き換えることができるので。

class Display

attr_accessor :print

def initialize
@print = []
end

def write(msg)
@print.push(msg)
end
end

def display_capture
disp = Display.new
$stdout = disp
yield
$stdout = STDOUT
return disp.print
end
def test_hoge
res = display_capture do
print 1
print 2
end
assert_equal([1, 2], res)
end

適当に作ったDisplayクラスを標準出力にして処理が終わった後にSTDOUTという定数を標準出力に戻している。

あと、yieldが使ってみたかった。