4

我的食谱中有以下模板文件创建:

template "my_file" do
  path "my_path"
  source "my_file.erb"
  owner "root"
  group "root"
  mode "0644"
  variables(@template_variables)
  notifies :restart, resources(service: "my_service")
end

以及我的 ChefSpec 测试中的以下断言:

  chef_run.should create_file "my_file"
  chef_run.file("my_file").should be_owned_by('root', 'root')

这会导致以下失败:

  No file resource named 'my_file' with action :create found.

这是因为我使用的不是file资源而是template资源。问题:如何使用 ChefSpec 测试模板资源的文件创建?

4

2 回答 2

7

有两种方法可以解决您的问题。

首先,您可以使用create_template匹配器。这将仅匹配运行上下文中的“模板”资源:

expect(chef_run).to create_template('my_file')

这个匹配器也是可链接的,所以你可以断言属性:

expect(chef_run).to create_template('my_file')
  .with_path('my_path')
  .with_owner('root')

但是,此匹配器实际上不会渲染模板。因此,您无法检查是否正确设置了文件特异性。

对于实际呈现内存中的内容的任何类型的“文件”( 、 和 ),file还有cookbook_file一个顶级匹配器:template

expect(chef_run).to render_file('my_file').with_content(/^match me$/)

render_file您可以在 README中找到更多信息。

于 2014-02-01T19:00:59.970 回答
5

根据文档(https://github.com/acrmp/chefspec),您应该能够使用:

expect(chef_run).to create_file 'my_file'

但是,我认为最近发生了一些变化(可能是 ruby​​gems 上的 chefspec 版本),因为我今天早些时候通过的测试(使用您正在使用的相同语法)现在突然失败了。

于 2013-08-27T04:26:28.070 回答