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 使用临时文件来捕获输出,因此速度明显 (~30x) 慢于 to_stdout 和 to_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” |