我有一个需要清理的 Chef 存储库。配置数据分散在节点、环境和角色文件夹中的文件中。
我的想法是在重构数据期间使用ChefSpec来测试回归。由于 ChefSpec 似乎只直接支持角色,我如何在 ChefSpec 测试中使用现有节点/环境?
我有一个需要清理的 Chef 存储库。配置数据分散在节点、环境和角色文件夹中的文件中。
我的想法是在重构数据期间使用ChefSpec来测试回归。由于 ChefSpec 似乎只直接支持角色,我如何在 ChefSpec 测试中使用现有节点/环境?
回答我自己,以防其他人可能会发现它有用:
我最终得到了一个这样的例子:
it 'renders config file with proper data on node ABC in environment XYZ' do
runner = ChefSpec::Runner.new
node_attr = JSON.parse(File.open('nodes/ABC.json'))
runner.node.consume_attributes(node_attr)
env_attr = JSON.parse(File.open('environments/XYZ.json'))
env = Chef::Environment.json_create(env_attr)
runner.node.stub(:chef_environment).and_return('XYZ')
Chef::Environment.stub(:load).and_return(env)
runner.converge('cookbook::recipe')
expect(runner).to render_file('/etc/cookbook.cfg').with_content('some data from ABC.json')
end
这适用于“monolithic chef repo”模式,我在我们厨师采用的早期阶段使用它 - 实际上我们正在使用 chef-solo,但是在一个试图与厨师 repo 兼容的文件夹结构上。
此外,如果没有 ChefSpec 的速度,我不想在所有必要的重组过程中测试回归!