output 匹配器

output 匹配器提供了一种方法来断言块是否已向 $stdout$stderr 发出了内容。

如果没有参数,则在块输出到 to_stdoutto_stderr 时通过。如果带有一个字符串,则在块输出该特定字符串到 to_stdoutto_stderr 时通过。如果带有正则表达式或匹配器,则在块输出到 to_stdoutto_stderr 的字符串与之匹配时通过。

注意:to_stdoutto_stderr 通过临时替换 $stdout$stderr 来工作,因此它们无法拦截显式使用 STDOUT/STDERR 或使用在匹配器使用之前存储的 $stdout/$stderr 引用 的流输出。

要捕获从任何生成的子进程输出,请使用 to_stdout_from_any_processto_stderr_from_any_process。来自继承主进程的相应标准流的任何进程的输出将被捕获。

注意:to_stdout_from_any_processto_stderr_from_any_process 使用临时文件来捕获输出,因此速度明显 (~30x) 慢于 to_stdoutto_stderr

使用 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 个示例,5 个失败
预期块输出到 stdout,但没有
预期块不输出到 stdout,但输出 “foo”
预期块输出 “bar” 到 stdout,但输出 “foo”
预期块输出 “foo” 到 stdout,但没有输出任何内容
预期块输出 /bar/ 到 stdout,但输出 “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 个示例,5 个失败
预期块输出到 stderr,但没有
预期块不输出到 stderr,但输出 “foo
预期块输出 "bar” 到 stderr,但输出 “foo
————————————————————–
预期块输出 “foo” 到 stderr,但没有输出任何内容
预期块输出 /bar/ 到 stderr,但输出 “foo

使用 output_to_stdout_from_any_process 匹配器

给定一个名为 “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

我运行 rspec output_to_stdout_from_any_process_spec.rb

然后输出应包含所有这些

11 个示例,5 个失败
预期块输出到 stdout,但没有
预期块不输出到 stdout,但输出 “foo”
预期块输出 “bar” 到 stdout,但输出 “foo”
预期块输出 “foo” 到 stdout,但没有输出任何内容
预期块输出 /bar/ 到 stdout,但输出 “foo”

使用 output_to_stderr_from_any_process 匹配器

给定一个名为 “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

我运行 rspec output_to_stderr_from_any_process_spec.rb

然后输出应包含所有这些

11 个示例,5 个失败
预期块输出到 stderr,但没有
预期块不输出到 stderr,但输出 “foo”
预期块输出 “bar” 到 stderr,但输出 “foo”
预期块输出 “foo” 到 stderr,但没有输出任何内容
预期块输出 /bar/ 到 stderr,但输出 “foo”