rubyで標準出力をテストする方法

最近毎日のように読んでいるwycatsさんが便利なメソッドを利用していたのでメモしておく。

# -*- coding:utf-8 -*-
require "rubygems"
require "spec"

# this method is written by wycats
def capture(stream)
  begin
    stream = stream.to_s
    eval "$#{stream} = StringIO.new"
    yield
    result = eval("$#{stream}").string
  ensure
    eval("$#{stream} = #{stream.upcase}")
  end

  result
end

describe "Object#capture" do
  it do
    capture(:stdout) { print "hoge" }.should == "hoge"
  end
end

めちゃくちゃ便利です。