2017-05-11 26 views
0

ruby​​_blockのChefSpec Unitテストを書くには?ローカル変数がレシピで宣言されている場合はどうなりますか?どのように処理されますか?ここでRuby_blockリソースのChefSpecユニットテストの書き方は?

はレシピのコードです:私はChefSpecに新しいですしたよう

package 'autofs' do 
    action :install 
end 

src = '/etc/ssh/sshd_config' 

unless ::File.readlines(src).grep(/^PasswordAuthentication yes/).any? 
    Chef::Log.warn "Need to add/change PasswordAuthentication to yes in sshd config." 
    ruby_block 'change_sshd_config' do 
    block do 
     srcfile = Chef::Util::FileEdit.new(src) 
     srcfile.search_file_replace(/^PasswordAuthentication no/, "PasswordAuthentication yes") 
     srcfile.insert_line_if_no_match(/^PasswordAuthentication/, "PasswordAuthentication yes") 
     srcfile.write_file 
    end 
    end 
end 

unless ::File.readlines(src).grep('/^Banner /etc/issue.ssh/').any? 
    Chef::Log.warn "Need to change Banner setting in sshd config." 
    ruby_block 'change_sshd_banner_config' do 
    block do 
     srcfile = Chef::Util::FileEdit.new(src) 
     srcfile.search_file_replace(/^#Banner none/, "Banner /etc/issue.ssh") 
     srcfile.insert_line_if_no_match(/^Banner/, "Banner /etc/issue.ssh") 
     srcfile.write_file 
    end 
    end 
end 

、私は基本的なリソースのためのコードを書くことができています。私はユニットテストを以下のように書いています:

require 'chefspec' 

describe 'package::install' do 

    let(:chef_run) { ChefSpec::SoloRunner.new(platform: 'ubuntu', version: '16.04').converge(described_recipe) } 

    it 'install a package autofs' do 
    expect(chef_run).to install_package('autofs') 
    end 

    it 'creates a ruby_block with an change_sshd_config' do 
    expect(chef_run).to run_ruby_block('change_sshd_config') 
    end 

    it 'creates a ruby_block with an change_sshd_banner_config' do 
    expect(chef_run).to run_ruby_block('change_sshd_banner_config') 
    end 

end 

上記の実装はどちらですか?私はそれがどのようにルビーブロックなどの複雑なリソースのために書かれることができるかを理解することができません。そして、レシピで宣言されたローカル変数には注意が必要です。 ありがとうございます。

+0

これはかなりあなたができることです。 ChefSpecはruby_blockを実行しません。ruby_blockが正しいアクションでリソースコレクション内にあるかどうかをチェックします。ルビブロックの結果をテストするには、例えばtest-kitchenやinspecなどの統合テストを記述する必要があります。 –

答えて

0

ユニットテストでは、特定の入力が予想される出力を生成していることをテストする必要があります。シェフにrun_ruby_blockがあると期待することによって、あなたは本質的に「シェフは私がそれを期待しているように働くのですか?」「私の期待通りに私のruby_blockリソースが働くのですか?

ruby_blockの副作用が期待どおりであることを確認するには、ChefSpecを使用する必要があります。つまり、ファイルが変更されています。 RenderFileMatchersのChefSpecのドキュメントはおそらくあなたが探しているものです。

+0

ChefSpecはユニットテストフレームワークであり、ノードを収束せず、ruby_blockを実行しません。リソースが最終的なリソースコレクションに含まれているかどうかだけ確認できます。 –

+0

よろしくお願いします。一般的に、これが私がChefSpecを一緒に避けようとする理由です。[Serverspec](http://serverspec.org/)のようなものに賛成です。 少なくとも、ファイルを偽装し、 'ruby_block'の副作用をテストすることは可能でしょうか? – vase

+1

OPは ':: File.readlines(...)。grep(...)。any? '呼び出しをモックし、' ruby​​_block'がリソースコレクション内にあるかどうかをチェックしなければなりません。 –

1
let(:conf) { double('conf') } 
    before do 
     allow(File).to receive(:readlines).with('/etc/ssh/sshd_config').and_return(["something"]) 
     allow(File).to receive(:readlines).with('/etc/ssh/sshd_config').and_return(["something"]) 
end 

it 'creates a ruby_block with an change_sshd_config' do 
    expect(chef_run).to run_ruby_block('change_sshd_config') 
    expect(Chef::Util::FileEdit).to receive(:new).with('/etc/ssh/sshd_config').and_return(conf) 
    confile = Chef::Util::FileEdit.new('/etc/ssh/sshd_config') 
    end 

他のルビーブロックと同じことをやってください!ほとんどそれは動作します。

それとも

あなたはあなたのシステムの状態をテストするためにINSPECを使用してテストすることができます。 Chefがconfigを適用した後にsshdが設定される方法について、あなたのシステムの状態をテストしたいと思うようです。あなたは、次のコードのようなものでINSPECでそれを達成できます。

describe file('/etc/ssh/sshd_config') do 
    its('content') { should match /whatever/ } 
end 

私はこれが役に立てば幸い!

関連する問題