Как написать ChefSpec Unit Test для ресурса ruby_block?
Как написать модульные тесты ChefSpec для ruby_block? Что если локальные переменные объявлены в рецепте? Как это будет обработано?
Вот код рецепта:
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
Поскольку я новичок в ChefSpec, я могу написать код для основных ресурсов. Я написал модульный тест, как показано ниже:
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
Является ли приведенная выше реализация корректной? Я не могу понять, как это можно написать для сложных ресурсов, таких как блок ruby и т. Д. И как следует позаботиться о локальных переменных, объявленных в рецепте. Заранее спасибо..
2 ответа
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, чтобы проверить состояние вашей системы. Кажется, что вы можете захотеть проверить состояние вашей системы на предмет конфигурации sshd после того, как Chef применил config. Вы можете сделать это с помощью inspec с помощью следующего фрагмента:
describe file('/etc/ssh/sshd_config') do
its('content') { should match /whatever/ }
end
Надеюсь, это поможет!
Модульные тесты должны проверять, что конкретные входы дают ожидаемые результаты. Ожидая, что шеф-повар run_ruby_block
по сути, вы говорите: "Работает ли шеф-повар так, как я этого ожидаю?" ruby_block
Ресурс работает так, как я этого ожидаю ".
Вы должны использовать ChefSpec для подтверждения того, что побочные эффекты ruby_block
это то, что вы ожидаете от них. То есть, что файл (ы) изменены. Документация ChefSpec для RenderFileMatchers, вероятно, то, что вы ищете.