在RSpec中检查(不存在)`puts`

时间:2009-10-09 21:43:05

标签: ruby tdd mocking rspec bdd

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

Kernel.should_not_receive :puts

当输出到控制台时,这不会导致测试失败。

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

2 个答案:

答案 0 :(得分:15)

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

哪个检查没有按预期写入stdout。 Kernel.puts(如上所述)只会导致测试失败 被明确地称为(例如Kernel.puts“Some text”),其中 在大多数情况下,它都在当前对象的范围内调用。

答案 1 :(得分:4)

上面接受的答案是错误的。它“有效”,因为它没有收到:写入消息,但它可能收到了: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