2014-02-11 2 views
0

У меня есть тест, который я хочу запустить, чтобы проверить, что я получаю вывод в 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 

Который работает и тест пройден, но он чувствует себя очень Hacky, и вы получите ошибки предупреждения о Руби уже инициализированной константе.

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

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, но предпочитающих не к) и идентификатор пробега (который установлен в Фарадее, я мог бы заглушить, но опять же: я бы предпочел не ...)

Итак, суть вопроса заключается в следующем: есть ли способ do 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 
+0

Ах, я думаю, У меня просто был синтаксис неправильный или что-то, когда я последний раз его запускал. Благодаря! –