我有一个要运行的测试来测试我在 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