0

我有一本食谱,它安装了节点属性提供的软件包列表。是否可以使用 chefspec 测试这种类型的软件包安装?就像现在一样,我收到一个错误:

1) foo::default installs test-package-1
 Failure/Error: expect(chef_run).to install_package(pkg)
   expected "package[test-package-1]" with action :install to be in Chef run. Other package resources:
     package[["test-package-1", "1.0.0"]]
     package[["test-package-2", "1.2.3"]]

Chefspec 没有看到正在安装该软件包,即使它就在那里列出!当然,我在这里遗漏了一些明显的东西。

这是相关的食谱文件:

属性/default.rb

node.default['foo']['packages'] = {
  'test-package-1' => '1.0.0',
  'test-package-2' => '1.2.3'
}

食谱/default.rb

node['foo']['packages'].each do |pkg|
  package pkg do
    version node['foo']['packages'][pkg]
    action :install
  end
end

规范/default_spec.rb

describe "foo::default" do
  let(:chef_run) { ChefSpec::SoloRunner.converge(described_recipe) }

  %w(
    test-package-1
    test-package-2
  ).each do |pkg|
    it "installs #{pkg}" do
      expect(chef_run).to install_package(pkg)
    end
  end
end
4

1 回答 1

1

Ruby'sHash#each是 的别名each_pair,而不是each_key. 这与 Python 和 JavaScript 等默认迭代键的语言不同。在这种情况下,您的测试正确地表明您的食谱代码是错误的:-)

node['foo']['packages'].each do |pkg, pkg_ver|
  package pkg do
    version pkg_ver
    action :install
  end
end
于 2016-01-19T19:42:38.177 回答