Как заглушить STDOUT в Ruby без предупреждения об ошибках?

У меня есть тест, который я хочу запустить, чтобы проверить, что я получаю вывод в STDOUT в Ruby.

Прямо сейчас мой тест выглядит так:

STDOUT.sync = true
@orig_stdout_constant = STDOUT
STDOUT  = StringIO.new

subject.request(:get, '/success')

expect(STDOUT.string).to include 'INFO -- : get https://api.example.com/success', 'INFO -- : get https://api.example.com/success'

STDOUT  = @orig_stdout_constant

Это работает, и тест проходит, но он выглядит очень хакерским, и вы получите ошибки предупреждения Ruby об уже инициализированной константе.

Я знаю, что вы можете сделать это:

subject.request(:get, '/success')

STDOUT.should_receive(:print).with("I, [2014-02-11T14:55:00.282124 #650]  INFO -- : get https://api.example.com/success")

Но строка, как вы можете видеть, имеет два значения, которые будут меняться при каждом запуске теста: время (которое я могу исправить с помощью TimeCop, но я предпочитаю этого не делать) и идентификатор запуска (который установлен в Фарадее, я мог бы заглушить, но опять же: я бы предпочел не...)

Итак, суть того, что я спрашиваю: есть ли способ сделать STDOUT.should_receive(:print).with(/[\s\S]+ INFO -- : get https:\/\/api.example.com\/success/) или сделать какое-то совпадение на получение?

Полный код здесь, если это поможет: https://github.com/petems/oauth2/blob/faraday_debug/spec/oauth2/client_spec.rb#L123

1 ответ

Решение

Да, вы можете сделать именно то, что вы предложили, так как with принимает регулярное выражение в качестве аргумента, как в:

describe "RSpec's #with method" do
  it "accepts a regex" do
    object = Object.new
    object.should_receive(:foo).with(/bar/)
    object.foo('foobar')
  end
end
Другие вопросы по тегам