2016-06-30 6 views
0

シェフのInSpecで他のリソース内で1つのリソースを使用できますか?シェフのネストされたリソースInSpec

例:

describe command('su srijava') do 
    describe file ('/app/java/latest') do  
     it{ should exist } 
    end 
end 

それはのようなエラーがスローされます。

`method_missing': undefined method `file' for RSpec::ExampleGroups::CommandSuSriava:Class (NoMethodError) 

は実際に私が何をしたいのか、私は他のユーザーと私にインストールされているユーティリティを実行する必要があるということですそのセッションから返された出力をチェックし、それを確認する必要があります。例:

  • 私は(そのユーザーだけでjava -version実行しているといないルートとして想定)Javaのバージョンをテストするためにコマンドを書いたインスペックで今srijavaユーザー
  • などのJavaをインストールしました。
  • 私はsu srijavaを使用している場合、私は得ることはありません出力は ルートセッションに戻って、私はその後、私のユーティリティがエラーをスローしますsu srijavaなしで実行した場合、テストは、ユーザーがSriJavaない こと
  • を失敗しましたsu

コード:

describe command('su srijava ; cd /app/java; ./java --version') do 
     its('stdout') { should match('1.7') } 
end 

コードsuなし:

describe command('cd /app/java; ./java --version') do 
     its('stdout') { should match('1.7') } 
end 

どうすればいいですか?

答えて

1

ノアが指摘したように、ネストされた記述ブロックはまだサポートされていません。私はまたあなたがそれらを必要としないと思う。

result = command('runcommand').stdout 
filename = result + '/path' 
describe file (filename) do  
    it{ should exist } 
end 

一方、bashリソースを使用すると、複数のコマンドを実行できます。 commandは、ユーザーのデフォルトシェルを使用し、bashがそれを強制します。

describe bash('su srijava ; cd /app/java; ./java --version') do 
    its('stdout') { should match('1.7') } 
end 
0

いいえ、それは通常のRSpecでも2つが結合されないので意味がありません。ファイルをルートとしてチェックする必要がある場合は、InSpecのsudoオプションを使用できます。特定のユーザーとしてファイルが存在するかどうかを確認する理由はわかりませんが、サポートされていません。

+0

'su'はターゲットユーザーとして新しいシェルを実行します。同じシェルの後のコマンドに魔法の影響を与えることはありません。 'sudo -u whatever bash -c" cd/foo; something " – coderanger

+0

これは動作しません。私は 'コマンドの説明( 'sudo -u whatever bash -c" cd/foo; something "')を do {存在すべきです} end'のようにしました。'期待コマンドsudo -u whatever bash -c "cd/foo; something"が存在する – saurg

+0

InSpecの 'command'リソースは' exist'マッチャーに応答しません。コマンドには、stdout/errの内容や終了状態などのためのマッチャーがあります。 – coderanger

関連する問題