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
上記の実装はどちらですか?私はそれがどのようにルビーブロックなどの複雑なリソースのために書かれることができるかを理解することができません。そして、レシピで宣言されたローカル変数には注意が必要です。 ありがとうございます。
これはかなりあなたができることです。 ChefSpecはruby_blockを実行しません。ruby_blockが正しいアクションでリソースコレクション内にあるかどうかをチェックします。ルビブロックの結果をテストするには、例えばtest-kitchenやinspecなどの統合テストを記述する必要があります。 –