2014-02-11 25 views
0

我有一个测试,我想运行测试,我收到输出到STDOUT在Ruby中。如何在不引发警告错误的情况下在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 

其中一期工程和测试通过,但感觉非常哈克,你会得到关于已初始化的常量红宝石警告错误。

我知道你可以这样做:

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

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

但你可以看到字符串有两个值,将在每次运行测试时发生变化:时间(我可以用时空特警修复,但不喜欢到)和运行的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

是的,你可以做你提出什么,因为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

啊,我想当我上次运行它时,我的语法错误或者有些问题。谢谢! –

相关问题