ねこものがたり

いちにちいっぽ

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

relishapp.com

outputマッチャーを使うことで標準出力をテストすることができます。

RSpec.describe "output.to_stdout matcher" do
   # 出力されることを確かめられれば十分な場合はこう
  specify { expect { print('foo') }.to output.to_stdout }

  # 出力内容まで確認したい場合はこう
  specify { expect { print('foo') }.to output('foo').to_stdout }
end

自作gemで出力のテストをしたかったのでこういうコードを書いてみました。

https://github.com/neko314/factory_strategist/blob/8bcfaf7092732546df72ccf0307d328409d6bbfd/spec/factory_strategist/ext/rspec/core/example/procsy_put_best_strategy_spec.rb#L20-L26

describe "#put_best_strategy" do
  it do
    expect do
      example_procsy.put_best_strategy(:build)
    end.to output(/#{example_instance.location} create can be replaced to build/).to_stdout
  end
end

簡易的だけど「ないよりはいい」みたいなテストではあります。これから実装を肉付けしていきながらテストも充実させておきたい。

Railsアプリを書いているとこのマッチャーはあまり使わない気がしますがどうなんでしょう。Railsアプリ上で自前で標準出力に何かを出力させることはあるけど自分がやったことがあるのはテンポラリーな処理の場合かも(デバッグとか)。 そんなわけで「標準出力に出力されていることとその出力内容をテストしたい!」という動機が生まれたのが初めてかもしれないです。簡単でもいいので自分のコードを書くというのは、やる前には知らなかった欲求が生まれるのが楽しい。

上に貼った公式リファレンスに書いてあるように、標準出力だけでなく標準エラー出力もテストすることができるので、そういうテストを書く場面になったら使ってみようと思います。