Проверить (отсутствие) `puts` в RSpec

Я использую rspec для моего теста в проекте ruby, и я хочу указать, что моя программа не должна выводить ничего, когда используется опция -q. Я пробовал:

Kernel.should_not_receive :puts

Это не привело к неудачному тесту, когда на консоль был выход.

Как проверить отсутствие выходного текста?

Ответ 1

puts использует $stdout внутренне. Благодаря тому, как это работает, самый простой способ проверить - просто использовать: $stdout.should_not_receive(:write)

Какие проверки ничего не записываются в stdout, как ожидалось. Kernel.puts(как указано выше) приведет только к неудачному тесту, когда он (например, Kernel.puts "Some text" ), где как и большинство случаев, которые он вызывает в области текущего объекта.

Ответ 2

Принятый выше ответ неверен. Он "работает", потому что он не получает сообщение: 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 из проекта