Я хочу проверить, что стандартный вывод функции включает в себя одну строку, но не включает в себя другую, но я не могу понять, как ее сформулировать - ни одна из этих работ:
RSpec::Matches.define_negated_matcher :output, :not_output
expect {
...
}.to output "I found the thing".to_stdout.and not_output "The tiger bit me".to_stdout
RSpec::Matches.define_negated_matcher :output, :not_output
expect {
...
}.to output "I found the thing".and not_output "The tiger bit me".to_stdout
Я могу заставить это работать только через мой собственный код захвата stdout:
def expect_stdout
captured_stream = StringIO.new
original_stream = $stdout
$stdout = captured_stream
yield
expect(captured_stream.string)
ensure
$stdout = original_stream
puts(captured_stream.string)
end
RSpec::Matchers.define_negated_matcher :not_match_regex, :match_regex
expect_stdout {}.to match_regex(/found it/).and not_match_regex(/bitten by tiger/)
, но если я делаю это, кажется, что я могу также проигнорировать логи захвата RSpe c c полностью.
Я действительно не хочу дублировать весь тест только для положительных и отрицательных утверждений - это смешно.
Есть ли правильный способ сделать это, под RSpe c или я должен поднять вопрос?