我有一些rspec测试来检查命令的输出。
以前,我在嘲笑整个$ stdout.string,我可以这样做:
expect($stdout.string).to include 'DEBUG -- : Request Headers:'
expect($stdout.string).to include 'Bearer foo'
expect($stdout.string).to include 'Some other thing'
我正在重构这个以切换到rspec output(arg).to_stdout
方法。
然而,looking at the docs,它似乎只允许给出字符串或正则表达式:
RSpec.describe "output.to_stdout matcher" do
specify { expect { print('foo') }.to output.to_stdout }
specify { expect { print('foo') }.to output('foo').to_stdout }
specify { expect { print('foo') }.to output(/foo/).to_stdout }
我尝试将期望链接起来,但它不起作用:
expect { print 'foo bar baz' }.to output(/foo/).to_stdout.and output(/bar/).to_stdout.and output(/baz/).to_stdout
给出结果:
Failure/Error: expect { print 'foo bar baz' }.to output(/foo/).to_stdout.and output(/bar/).to_stdout.and output(/baz/).to_stdout
expected block to output /bar/ to stdout, but output nothing
...and:
expected block to output /baz/ to stdout, but output nothing
有没有办法给出一组预期的字符串?
答案 0 :(得分:1)
正如您似乎已经发现的那样,output
不允许您链接或compose,但您可以捕获expect
块并对其进行多次测试。< / p>
it 'verifies hello world' do
expectation = expect { puts 'hello'; puts 'world' }
expectation.to output(/hello/).to_stdout
expectation.to output(/world/).to_stdout
end
答案 1 :(得分:1)
传递给 output
的匹配器可以是任何匹配器,这使您可以使用 .and
匹配器将链接的 match
组合移动到内部:
expect { print 'foo bar baz' }.to output( match(/foo/).and match(/bar/).and match(/baz/) ).to_stdout
或者更接近于您的原始示例 include
可以采用字符串列表:
expect { print 'foo bar baz' }.to output(include('foo', 'bar', 'baz')).to_stdout