我有一些非常不正统的厨师代码,我需要编写一个单元测试,我无法找到正确的方法。
不幸的是,由于环境文件的结构,你需要看到所有这些for循环。环境文件无法解决,因为已经有数十本烹饪书写在上面
代码基本上如下所示:
# Redis Sentinel information
node['os_setup']['zones'].each do |_zone|
_zone['nodes'].each do |_node|
if _node['nodename'] =~ /mpredis/i #is it a redis node?
node['db']['redis_sentinels'] << _node['hostname']
end
end
end
# generate /etc/hosts entries for Redis Sentinels
node['db']['redis_sentinels'].each do |_hostname|
# add entry for INTERSITE network
hostsfile_entry findIPfrom_host(_hostname, 'REDIS') do
hostname "#{_hostname}.#{node['domain']}"
aliases [_hostname]
unique true
comment "appended by recipe[#{cookbook_name}::#{recipe_name}]"
action :create
end
# add entry for TRAFFIC network
hostsfile_entry findIPfrom_host(_hostname, 'TRAFFIC') do
hostname "#{_hostname}db.#{node['domain']}"
aliases ["#{_hostname}db"]
unique true
comment "appended by recipe[#{cookbook_name}::#{recipe_name}]"
action :create
end
end
findIPfrom_host()
函数可以在不同食谱的库中找到,它看起来像这样:
def getIPfrom_host(hostname, interface)
ip_addr = nil
node['os_setup']['zones'].each do |_zone|
_zone['nodes'].each do |_node|
if _node['hostname'] == hostname
_node['interfaces'].each do |_nic|
if _nic['device'] == node['interface_definitions'][interface.upcase]
ip_addr = _nic['ipaddress']
end
end
end
end
end
return ip_addr
end
我不得不承认我完全陷入了困境。我在ChefSpec文档或示例中找不到任何帮助。
这方面的人是否更了解这个领域?
谢谢!
答案 0 :(得分:0)
没有什么特别的事,只需设置一些节点属性的跑步者,然后检查正确的hostsfile_entry
资源(it { expect(chef_run).to create_hostsfile_entry('asdf') }
等)。