メインコンテンツまでスキップ

output マッチャー

output マッチャーは、ブロックが $stdout または $stderr にコンテンツを出力したことをアサートする方法を提供します。

引数なしの場合、ブロックが to_stdout または to_stderr に出力した場合にパスします。文字列を指定した場合、ブロックがその特定の文字列を to_stdout または to_stderr に出力した場合にパスします。正規表現やマッチャーを指定した場合、ブロックが to_stdout または to_stderr に出力された文字列と一致する場合にパスします。

注意: to_stdoutto_stderr$stdout または $stderr を一時的に置き換えることで動作するため、明示的に STDOUT/STDERR を使用する場合や、マッチャーが使用される前に $stdout/$stderr の参照が格納されている場合には、ストリームの出力をインターセプトすることはできません。

また、任意のサブプロセスからの出力をキャプチャするには、to_stdout_from_any_process または to_stderr_from_any_process を使用します。メインプロセスの対応する標準ストリームを継承する任意のプロセスからの出力がキャプチャされます。

注意: to_stdout_from_any_processto_stderr_from_any_process は出力をキャプチャするために一時ファイルを使用するため、to_stdoutto_stderr よりもかなり遅くなります(約30倍)。

output_to_stdout マッチャーの使用方法

以下の内容で "output_to_stdout_spec.rb" という名前のファイルを作成します。

RSpec.describe "output.to_stdout matcher" do
specify { expect { print('foo') }.to output.to_stdout }
specify { expect { print('foo') }.to output('foo').to_stdout }
specify { expect { print('foo') }.to output(/foo/).to_stdout }
specify { expect { }.to_not output.to_stdout }
specify { expect { print('foo') }.to_not output('bar').to_stdout }
specify { expect { print('foo') }.to_not output(/bar/).to_stdout }

# deliberate failures
specify { expect { }.to output.to_stdout }
specify { expect { }.to output('foo').to_stdout }
specify { expect { print('foo') }.to_not output.to_stdout }
specify { expect { print('foo') }.to output('bar').to_stdout }
specify { expect { print('foo') }.to output(/bar/).to_stdout }
end

rspec output_to_stdout_spec.rb を実行すると、

以下のすべてが出力に含まれるはずです:

| 11 examples, 5 failures | | ブロックが stdout に出力することを期待しましたが、出力されませんでした | | ブロックが stdout に出力しないことを期待しましたが、"foo" を出力しました | | ブロックが stdout に "bar" を出力することを期待しましたが、"foo" を出力しました | | ブロックが stdout に "foo" を出力することを期待しましたが、何も出力しませんでした | | ブロックが stdout に /bar/ を出力することを期待しましたが、"foo" を出力しました |

output_to_stderr マッチャーの使用方法

以下の内容で "output_to_stderr.rb" という名前のファイルを作成します。

RSpec.describe "output_to_stderr matcher" do
specify { expect { warn('foo') }.to output.to_stderr }
specify { expect { warn('foo') }.to output("foo\n").to_stderr }
specify { expect { warn('foo') }.to output(/foo/).to_stderr }
specify { expect { }.to_not output.to_stderr }
specify { expect { warn('foo') }.to_not output('bar').to_stderr }
specify { expect { warn('foo') }.to_not output(/bar/).to_stderr }

# deliberate failures
specify { expect { }.to output.to_stderr }
specify { expect { }.to output('foo').to_stderr }
specify { expect { warn('foo') }.to_not output.to_stderr }
specify { expect { warn('foo') }.to output('bar').to_stderr }
specify { expect { warn('foo') }.to output(/bar/).to_stderr }
end

rspec output_to_stderr.rb を実行すると、

以下のすべてが出力に含まれるはずです:

| 11 examples, 5 failures | | ブロックが stderr に出力することを期待しましたが、出力されませんでした | | ブロックが stderr に出力しないことを期待しましたが、"foo" を出力しました | | ブロックが stderr に "bar" を出力することを期待しましたが、"foo " を出力しました | | ブロックが stderr に "foo" を出力することを期待しましたが、何も出力しませんでした | | ブロックが stderr に /bar/ を出力することを期待しましたが、"foo " を出力しました |

output_to_stdout_from_any_process マッチャの使用方法

Given ファイル名が "output_to_stdout_from_any_process_spec.rb" のファイルがあるとき:

RSpec.describe "output.to_stdout_from_any_process matcher" do
specify { expect { system('printf foo') }.to output.to_stdout_from_any_process }
specify { expect { system('printf foo') }.to output("foo").to_stdout_from_any_process }
specify { expect { system('printf foo') }.to output(/foo/).to_stdout_from_any_process }
specify { expect { }.to_not output.to_stdout_from_any_process }
specify { expect { system('printf foo') }.to_not output("bar").to_stdout_from_any_process }
specify { expect { system('printf foo') }.to_not output(/bar/).to_stdout_from_any_process }

# deliberate failures
specify { expect { }.to output.to_stdout_from_any_process }
specify { expect { }.to output('foo').to_stdout_from_any_process }
specify { expect { system('printf foo') }.to_not output.to_stdout_from_any_process }
specify { expect { system('printf foo') }.to output('bar').to_stdout_from_any_process }
specify { expect { system('printf foo') }.to output(/bar/).to_stdout_from_any_process }
end

When rspec output_to_stdout_from_any_process_spec.rb を実行するとき

Then 出力には以下のすべてが含まれているはずです:

| 11 例中 5 つの失敗 | | 標準出力に出力することを期待しましたが、出力されませんでした | | 標準出力に出力しないことを期待しましたが、"foo" が出力されました | | 標準出力に "bar" を出力することを期待しましたが、"foo" が出力されました | | 標準出力に "foo" を出力することを期待しましたが、何も出力されませんでした | | 標準出力に /bar/ を出力することを期待しましたが、"foo" が出力されました |

output_to_stderr_from_any_process マッチャの使用方法

Given ファイル名が "output_to_stderr_from_any_process_spec.rb" のファイルがあるとき:

RSpec.describe "output.to_stderr_from_any_process matcher" do
specify { expect { system('printf foo 1>&2') }.to output.to_stderr_from_any_process }
specify { expect { system('printf foo 1>&2') }.to output("foo").to_stderr_from_any_process }
specify { expect { system('printf foo 1>&2') }.to output(/foo/).to_stderr_from_any_process }
specify { expect { }.to_not output.to_stderr_from_any_process }
specify { expect { system('printf foo 1>&2') }.to_not output("bar").to_stderr_from_any_process }
specify { expect { system('printf foo 1>&2') }.to_not output(/bar/).to_stderr_from_any_process }

# deliberate failures
specify { expect { }.to output.to_stderr_from_any_process }
specify { expect { }.to output('foo').to_stderr_from_any_process }
specify { expect { system('printf foo 1>&2') }.to_not output.to_stderr_from_any_process }
specify { expect { system('printf foo 1>&2') }.to output('bar').to_stderr_from_any_process }
specify { expect { system('printf foo 1>&2') }.to output(/bar/).to_stderr_from_any_process }
end

When rspec output_to_stderr_from_any_process_spec.rb を実行するとき

Then 出力には以下のすべてが含まれているはずです:

| 11 例中 5 つの失敗 | | 標準エラー出力に出力することを期待しましたが、出力されませんでした | | 標準エラー出力に出力しないことを期待しましたが、"foo" が出力されました | | 標準エラー出力に "bar" を出力することを期待しましたが、"foo" が出力されました | | 標準エラー出力に "foo" を出力することを期待しましたが、何も出力されませんでした | | 標準エラー出力に /bar/ を出力することを期待しましたが、"foo" が出力されました |