我在食谱中创建了以下模板文件:
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测试模板资源的文件创建?
答案 0 :(得分: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
in the README。
答案 1 :(得分:5)
根据文档(https://github.com/acrmp/chefspec),您应该可以使用:
expect(chef_run).to create_file 'my_file'
我认为最近发生了一些变化(可能是rubygems上的chefspec版本),但是,因为我今天早些时候通过的测试(使用你正在使用的相同语法)现在突然失败了。