【发布时间】:2016-03-09 17:09:51
【问题描述】:
我有一个需要清理的 Chef 存储库。配置数据分散在节点、环境和角色文件夹中的文件中。
我的想法是在重构数据期间使用ChefSpec 来测试回归。由于 ChefSpec 似乎只直接支持角色,我如何在 ChefSpec 测试中使用现有节点/环境?
【问题讨论】:
-
您似乎回答了自己的问题。您能否将答案标记为正确?
标签: chef-infra chefspec
我有一个需要清理的 Chef 存储库。配置数据分散在节点、环境和角色文件夹中的文件中。
我的想法是在重构数据期间使用ChefSpec 来测试回归。由于 ChefSpec 似乎只直接支持角色,我如何在 ChefSpec 测试中使用现有节点/环境?
【问题讨论】:
标签: chef-infra chefspec
大多数 Chef 工具都设计为与单个食谱一起使用。您可以在“monolithic Chef repo”模式中使用 ChefSpec。 ChefSpec 执行have support for mocking Environments 和roles。
当您编写 ChefSpec 测试(通常称为“示例”)时,它们针对的是单个说明书,而不是角色或环境。如果您为所有食谱编写了 ChefSpec 示例,那么您可以安全地进行此重构,在每次运行时运行测试。但是无法针对整个 Chef 存储库编写测试。
来源:
【讨论】:
回答我自己,以防其他人发现它有用:
我最终得到了一个这样的例子:
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
这适用于“整体厨师存储库”模式,我在厨师采用的早期阶段使用该模式 - 实际上我们使用的是 chef-solo,但在一个试图与厨师存储库兼容的文件夹结构上.
此外,如果没有 ChefSpec 的速度,我不想在所有必要的重组过程中测试回归!
【讨论】: