output
マッチャー
output
マッチャーは、ブロックが $stdout
または $stderr
にコンテンツを出力したことをアサートする方法を提供します。
引数なしの場合、ブロックが to_stdout
または to_stderr
に出力した場合にパスします。文字列を指定した場合、ブロックがその特定の文字列を to_stdout
または to_stderr
に出力した場合にパスします。正規表現やマッチャーを指定した場合、ブロックが to_stdout
または to_stderr
に出力された文字列と一致する場合にパスします。
注意: to_stdout
と to_stderr
は $stdout
または $stderr
を一時的に置き換えることで動作するため、明示的に STDOUT
/STDERR
を使用する場合や、マッチャーが使用される前に $stdout
/$stderr
の参照が格納されている場合には、ストリームの出力をインターセプトすることはできません。
また、任意のサブプロセスからの出力をキャプチャするには、to_stdout_from_any_process
または to_stderr_from_any_process
を使用します。メインプロセスの対応する標準ストリームを継承する任意のプロセスからの出力がキャプチャされます。
注意: to_stdout_from_any_process
と to_stderr_from_any_process
は出力をキャプチャするために一時ファイルを使用するため、to_stdout
と to_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" が出力されました |