puts や print などの標準出力に文字列を出力するメソッドはちょっとしたスクリプトから規模の大きいプロダクトまで幅広く使われる。これらのメッセージ出力メソッドは使うのはお手軽だが、テストコードを書くことを考えると意外と面倒になる。そこで標準出力の内容を簡単にテストするための gem パッケージを作った。
stdout
https://rubygems.org/gems/stdout
ターミナルから以下のコマンドを投入すればインストールされる。
似たような機能のものは無くもなかったが、要件にイマイチ合わなかったので作ったほうが早いと思った。思想としては 1) 標準出力に出力されるはずのメッセージを一行ごとに配列オブジェクトとして取得できる 2) 小さくてシンプルお手軽、である。ちなみに Hadoop Streaming でも標準出力を使うので Ruby で Hadoop を利用する際のデバッグにも使えると思う。詳細は GitHub のリポジトリにドキュメントやデモやテストコードがあるのでそちらを見たほうが早いとは思うが、日本語でも説明を書いておく。
説明
たとえば以下のように、メッセージを三回出力するメソッドがあったとする。
puts "処理開始"
# なんかする
puts "現在処理中です"
# なんかする
puts "処理が完了しました!"
end
上記のメソッドを、以下のようにブロックで囲むと result に格納される戻り値が文字列の配列になる。
result = Stdout::Output.capture {
some_method
}
p result # => ["処理開始\n", "現在処理中です\n", "処理が完了しました!\n"]
あとは取得した配列オブジェクトに対してテストを書けば良い。簡単ですね。