【问题标题】:How can I use ChefSpec during refactoring of environments/roles/nodes在重构环境/角色/节点期间如何使用 ChefSpec
【发布时间】:2016-03-09 17:09:51
【问题描述】:

我有一个需要清理的 Chef 存储库。配置数据分散在节点、环境和角色文件夹中的文件中。

我的想法是在重构数据期间使用ChefSpec 来测试回归。由于 ChefSpec 似乎只直接支持角色,我如何在 ChefSpec 测试中使用现有节点/环境?

【问题讨论】:

  • 您似乎回答了自己的问题。您能否将答案标记为正确?

标签: chef-infra chefspec


【解决方案1】:

大多数 Chef 工具都设计为与单个食谱一起使用。您可以在“monolithic Chef repo”模式中使用 ChefSpec。 ChefSpec 执行have support for mocking Environmentsroles

当您编写 ChefSpec 测试(通常称为“示例”)时,它们针对的是单个说明书,而不是角色或环境。如果您为所有食谱编写了 ChefSpec 示例,那么您可以安全地进行此重构,在每次运行时运行测试。但是无法针对整个 Chef 存储库编写测试。

来源:

  • 我维护它并编写了当前版本

【讨论】:

  • 我不完全理解“无法针对您的整个 Chef 存储库编写测试”。假设我有两本共享资源使用模式的食谱。我想将此因素考虑到两者都引用的第三本食谱中的定义。你会说,这超出了 chefspec 测试的范围吗? (我希望不会,因为它的速度非常棒!)
【解决方案2】:

回答我自己,以防其他人发现它有用:

我最终得到了一个这样的例子:

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 的速度,我不想在所有必要的重组过程中测试回归!

【讨论】: