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

Pet*_*ter 9 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'
Run Code Online (Sandbox Code Playgroud)

我正在重构它以切换到 rspecoutput(arg).to_stdout方法。

然而,查看文档,它似乎只允许给出字符串或正则表达式:

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 }
Run Code Online (Sandbox Code Playgroud)

我尝试链接期望,但没有成功:

expect { print 'foo bar baz' }.to output(/foo/).to_stdout.and output(/bar/).to_stdout.and output(/baz/).to_stdout
Run Code Online (Sandbox Code Playgroud)

给出结果:

 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
Run Code Online (Sandbox Code Playgroud)

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

Ven*_*tsu 11

传递给的匹配器output可以是任何匹配器,这使您可以.and使用match匹配器将链接的组合移动到内部:

expect { print 'foo bar baz' }.to output( match(/foo/).and match(/bar/).and match(/baz/) ).to_stdout 
Run Code Online (Sandbox Code Playgroud)

或者更接近原始示例include可以采用字符串列表:

expect { print 'foo bar baz' }.to output(include('foo', 'bar', 'baz')).to_stdout 
Run Code Online (Sandbox Code Playgroud)