如何在Ruby中存根STDOUT而不会引发警告错误?

时间:2014-02-11 15:05:48

标签: ruby logging rspec stdout faraday

我有一个测试,我想运行以测试我在Ruby中收到STDOUT的输出。

现在我的测试看起来像这样:

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,你会得到关于已经初始化的常量的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修复但不喜欢)和运行的id(在法拉第设置,我可以存根,但又一次:我不想......)

所以问的关键在于:有没有办法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 个答案:

答案 0 :(得分: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