例としてjavaのバージョンをチェックするテストを以下のように実行しようとした場合。
describe command("java -version") do its(:stdout) { should match /java version "1.7/ } end
以下の結果になり、期待値(expected)が""と空になっている。
Failures: 1) Command "java -version" stdout should match /java version "1.7/ On host `hoge' Failure/Error: its(:stdout) { should match /java version "1.7/ } expected "" to match /java version "1.7/ sudo -p 'Password: ' env PATH="/sbin:/usr/local/sbin:$PATH" /bin/sh -c java\ -version
結論
java -versionコマンドの出力結果が標準出力(stdout)ではなく標準エラー(stderr)に出力されているため、its(:stdout)では出力を取得できないから。
なぜ標準出力ではなく、標準エラーへ出力されるのかは謎。 一応調べてみたけどそういう仕様っぽく、nginxとかも同様らしい。 という事なので回避するには以下のどちらかで対処する感じになりそう。
1.全ての出力を標準出力へ出す
describe command("java -version 2>&1") do its(:stdout) { should match 'java version "1.7.0_131"' } end
2.stdoutではなくstderrでテストを行う
describe command("java -version") do its(:stderr) { should match /java version "1.7.0_131"/ } end
java -versionの仕様として「stderr」へ出力を行うのであれば「stderr」でテストするのが正しいような気もするが、 テストケースをパッと見たときに 「stderr」 と書いてあると混乱しそうな気もする。。。