10

我在 ruby​​ 项目中使用 rspec 进行测试,并且我想指定我的程序在使用 -q 选项时不应输出任何内容。我试过:

Kernel.should_not_receive :puts

当有输出到控制台时,这并没有导致测试失败。

如何验证文本输出的缺失?

4

2 回答 2

15

puts 在内部使用 $stdout。由于它的工作方式,最简单的检查方法是简单地使用:$stdout.should_not_receive(:write)

它检查没有按预期写入标准输出。Kernel.puts(如上)只会在被明确调用时导致测试失败(例如 Kernel.puts “Some text”),在大多数情况下,它是在当前对象的范围内调用的。

于 2009-10-10T12:10:24.893 回答
4

上面接受的答案是不正确的。它“有效”是因为它没有收到 :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

于 2010-11-01T06:27:14.800 回答