Rubyでコンソールへの出力を抑制する

概要

次のような単体テストをいくつか書いています。

def executing_a_signal
  a_method(a_signal.new, a_model, a_helper);
  assert_equal(new_state, a_model.state)
end

テストは正常に機能しますが、ロジックを実行するアサーションの直前に実行されるメソッドは、主に put 経由でさまざまなメッセージをコンソールに出力します。

コンソールへの出力を抑制する簡単な (おそらく組み込みの) 方法はありますか?私はモデルオブジェクトに対するメソッドの最終的な効果のみに興味があり、基本的にコンソールをきれいに保つために、それらを書き直したりコメントアウトしたりせずに、コンソールへのすべての出力を単純に防ぐ方法を見つけたいと思っていました。私のテストのためだけにステートメントを置きます。

それは間違いなく重大な問題ではありませんが、それに関する考えやアイデア (または回避策) をぜひ聞きたいと思っています。

解決策

テストで次のスニペットを使用して、STDOUT をキャプチャしてテストします。

def capture_stdout(&block)
  original_stdout = $stdout
  $stdout = fake = StringIO.new
  begin
    yield
  ensure
    $stdout = original_stdout
  end
  fake.string
end

この方法を使用すると、上記は次のようになります。

def executing_a_signal
  capture_stdout { a_method(a_signal.new, a_model, a_helper) }
  assert_equal(new_state, a_model.state)
end