我在ruby项目中使用rspec进行测试,并且我想规定在使用-q选项时我的程序不应输出任何内容。我试过了:
Kernel.should_not_receive :puts
当输出到控制台时,这不会导致测试失败。
如何验证文本输出的缺失?
答案 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