#rspec #puppet
#rspec #puppet
Вопрос:
Я пытаюсь написать rspec для тестирования кода puppet. В моем puppet я вызвал define type, который не является частью этого класса. (ранее определено) Код puppet работает в тесте find in branch, но rspec не смог передать «reuire». Puppet:
$gluster_path = '/usr/libexec/zabbix-gluster'
$gluster_discovery_script = "${gluster_path}/gstatus_discovery.py"
$user_param_lines = [
"UserParameter=gluster_volume_info[*],${gluster_discovery_script} $1 $2n",
"UserParameter=gluster_storage_info[*],${gluster_discovery_script} $1n",
"UserParameter=gluster_volume_name.discovery,${gluster_discovery_script}n",
]
...
zabbix::agent::userparam { 'glusterfs':
content => join($user_param_lines, ''),
}
Rspec:
...
it {
is_expected.to contain_zabbix__agent__userparam('cnvr-zabbix-gluster')
}
определить тип:
define zabbix::agent::userparam($content = undef, $source = undef) {
...
file { "/etc/zabbix/zabbix_agentd.d/userparameter_${title}.conf":
...
require => [
Package['zabbix-agent'],
File['zabbix_agentd_dir'],
],
content => $content,
source => $_source,
notify => Service['zabbix-agent'],
}
Zabbix-агент был установлен из других модулей. Но ошибка продолжает запрашивать:
Puppet::Ошибка: не удалось найти ресурс ‘Package [zabbix-agent]’ в параметре ‘require’ (файл: /home/edwu/puppet /modules/zabbix/manifests/agent/userparam.pp, строка: 17) на узле
Есть ли способ пропустить проверку этого требования в rspec?
Ответ №1:
Есть ли способ пропустить проверку этого требования в rspec?
Ошибка, о которой сообщается в тесте RSpec, является ошибкой компиляции каталога. Это никоим образом не относится к RSpec. Действительно, это указывает на подлинную слабость zabbix::agent::userparam
и, как следствие, вероятный недостаток в вашем тестируемом классе. Это как раз одна из причин написания тестов RSpec!
Проблема в том, что zabbix::agent::userparam
он не стоит независимо. Он требует Package['zabbix-agent']
объявления, но он не объявляет его сам и не объявляет класс, который это делает. Ваш тестируемый класс наследует эту слабость, хотя чем дальше вы удаляетесь от центра проблемы, тем больше вам приходится склоняться к тому, чтобы называть это ошибкой, а не просто слабостью. Ваш класс тоже может объявить необходимый другой класс, и, вероятно, это должно быть сделано.
Вы не можете заставить конструктор каталогов разрешить требование к несуществующему ресурсу пройти незамеченным, и вы не должны этого делать, потому что это относится к тем вещам, которые вы хотите, чтобы ваши тесты показывали вам. Но если вы хотите, чтобы эта слабость в вашем классе сохранялась, вы можете использовать предварительное условие RSpec, чтобы заставить RSpec объявить соответствующий класс для вас, чтобы требование действительно было выполнено.
Комментарии:
1. Спасибо @John за подробные объяснения. Я добавил let(:pre_condition) поверх спецификации, чтобы охватить любые возможные классы, которые могут потребоваться, с помощью «include zabbix::agent», «include other::classes», …. Как вы сказали, это слабость zabbix ::agent::userparam . Ценю ваши объяснения.