Может ли вывод RSpe c ожидать как «совпадение строк», так и «не совпадение строк»? - PullRequest
0 голосов
/ 28 февраля 2020

Я хочу проверить, что стандартный вывод функции включает в себя одну строку, но не включает в себя другую, но я не могу понять, как ее сформулировать - ни одна из этих работ:

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 или я должен поднять вопрос?

...