Как написать 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, вероятно, то, что вы ищете.

Другие вопросы по тегам