2017-11-18 7 views
0

コマンドの出力を確認するためにいくつかのrspecテストがあります。複数の文字列をRspec stdout matcherに与えるには?

以前、私は、全体の$ 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

おそらく、[here](https://stackoverflow.com/a/6437567/2981429)のような正規表現で肯定的な先読みを使用できます。 –

答えて

1

すでに見つかっているように、outputはチェーン化することもcomposeを許可していませんが、ブロックexpectをキャプチャして複数のテストを実行できます。

it 'verifies hello world' do 
    expectation = expect { puts 'hello'; puts 'world' } 
    expectation.to output(/hello/).to_stdout 
    expectation.to output(/world/).to_stdout 
end 
関連する問題