3

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

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

4

2 回答 2

2

大多数 Chef 工具都设计为与单个食谱一起使用。您可以在“monolithic Chef repo”模式中使用 ChefSpec。ChefSpec 确实支持模拟环境角色

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

资料来源:

  • 我维护它并编写了当前版本
于 2014-01-27T17:39:34.953 回答
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

这适用于“monolithic chef repo”模式,我在我们厨师采用的早期阶段使用它 - 实际上我们正在使用 chef-solo,但是在一个试图与厨师 repo 兼容的文件夹结构上。

此外,如果没有 ChefSpec 的速度,我不想在所有必要的重组过程中测试回归!

于 2014-01-29T08:29:41.147 回答