如何为Rspec stdout匹配器提供多个字符串?

时间:2017-11-18 15:00:55

标签: ruby rspec stdout

我有一些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

有没有办法给出一组预期的字符串?

2 个答案:

答案 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