Как написать модульный тест для поставщика Chef?
На данный момент наша стратегия модульного тестирования использует ChefSpec для рецептов, и мы вкладываем большую часть интересной логики для наших поставщиков. в библиотеках, чтобы сделать логику более проверяемой. Однако мы по-прежнему сталкиваемся с проблемами, когда наши провайдеры вызывают другие ресурсы (помимо других простых логических проблем). Например:
action :run do
helper = Helper.new
template '/etc/hosts' do
source 'hosts.erb'
variables ({
"host" => @new_resource.host,
"ip_address" => node['ipaddress']
})
only_if { helper.update_hosts }
end
service 'httpd' do
action :restart
end
end
(это не настоящий код, просто тривиальный пример)
Что мы хотели бы сделать, так это протестировать этот провайдер изолированно, чтобы проверить наличие логических ошибок. У ChefSpec есть возможность входить в LWRP, но похоже, что это заставит нас включить LWRP в рецепт, а многие из наших поваренных книг в основном представляют собой LWRP-библиотеки без рецептов. Мы также просто хотели бы сохранить четкое разделение в наших тестах, чтобы было очевидно, какой компонент вышел из строя, глядя на имя файла.
Кроме того, было бы неплохо, если бы тест автоматически завершался ошибкой при наличии синтаксических ошибок в определении LWRP. Например:
action :run do
template '/etc/hosts/' do
source_whoops 'hosts.erb'
action :whoops
end
end
Было бы очень хорошо, если бы приведенный выше оператор привел к сбою теста из-за неправильного определения имени атрибута и отсутствия имени действия (точно так же, как ChefSpec).
Единственное решение, которое я придумал, — это создать «тестовую кулинарную книгу» — отдельную кулинарную книгу, которая определяет каждый LWRP 1:1 с помощью одного рецепта, чтобы ChefSpec мог вмешаться в нее таким образом. Это кажется разумным, но далеко не идеальным решением.