我在 ruby 项目中使用 rspec 进行测试,并且我想指定我的程序在使用 -q 选项时不应输出任何内容。我试过:
Kernel.should_not_receive :puts
当有输出到控制台时,这并没有导致测试失败。
如何验证文本输出的缺失?
puts 在内部使用 $stdout。由于它的工作方式,最简单的检查方法是简单地使用:$stdout.should_not_receive(:write)
它检查没有按预期写入标准输出。Kernel.puts(如上)只会在被明确调用时导致测试失败(例如 Kernel.puts “Some text”),在大多数情况下,它是在当前对象的范围内调用的。
上面接受的答案是不正确的。它“有效”是因为它没有收到 :write 消息,但它可能收到了 :puts 消息。
正确的行应该是:
$stdout.should_not_receive(:puts)
此外,您需要确保将这一行放在将写入 STDIO 的代码之前。例如:
it "should print a copyright message" do
$stdout.should_receive(:puts).with(/copyright/i)
app = ApplicationController.new(%w[project_name])
end
it "should not print an error message" do
$stdout.should_not_receive(:puts).with(/error/i)
app = ApplicationController.new(%w[project_name])
end
这是来自项目的实际工作 RSpec