如何为 Chef 提供者编写单元测试?
到目前为止,我们的单元测试策略将ChefSpec用于配方,并且我们将大部分有趣的逻辑填充到库中,以使逻辑更具可测试性。但是,我们仍然会遇到我们的提供者调用其他资源的问题(以及其他简单的逻辑问题)。例如:
action :run do
helper = Helper.new
template '/etc/hosts' do
source 'hosts.erb'
variables ({
"host" => @new_resource.host,
"ip_address" => node['ipaddress']
})
only_if { helper.update_hosts }
end
service 'httpd' do
action :restart
end
end
(这不是真正的代码,只是一个简单的例子)
我们想做的是单独测试这个提供程序以检查逻辑错误。ChefSpec 具有进入 LWRP 的能力,但看起来这会迫使我们将 LWRP 放入食谱中,而且我们的许多食谱基本上都是没有食谱的 LWRP 库。我们还希望在我们的测试中保持清晰的分离,因此通过查看文件名很明显哪个组件失败了。
此外,如果 LWRP 定义中有任何语法错误,测试会自动失败,那就太好了。例如:
action :run do
template '/etc/hosts/' do
source_whoops 'hosts.erb'
action :whoops
end
end
如果上面的语句由于属性名称定义不正确而导致测试失败,并且动作名称不存在(就像 ChefSpec 一样),那就太好了。
我想出的唯一解决方案基本上是创建一个“测试食谱”——一个单独的食谱,它用一个单一的食谱定义每个 LWRP 1:1,因此 ChefSpec 可以通过这种方式进入它。这似乎是一个合理但不太理想的解决方案。