RSpecで標準出力の内容をテストする

標準出力される内容をテストする内容を調べたところ、素晴らしいエントリーを見つけたので忘れないようにメモ


pochi's weblog

# -*- coding: utf-8 -*-

require "rspec"

class Target
  def some_method(msg)
    print msg
  end
end

# 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
  before(:each) do
    @target = Target.new
  end

  it do
    capture(:stdout) {
      @target.some_method("test")
    }.should == "test"
  end
end


全く同じような内容の質問が Rails Best Practice にも載っていたのでそちらもメモ


Rails Best Practices | Test STDIN / STDOUT in Rspec