2014-01-16 106 views
5

我如何写一个单元测试的厨师供应商?单元测试厨师提供商

到目前为止,我们的单元测试策略使用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可以这样做。这似乎是一个合理的,但不是理想的解决方案。

回答

6

看起来像有一个(非常新的)解决方案。

首先,this pull request基本上可以满足我的要求,但它已被ChefSpec维护人员拒绝,原因是可以理解的。

维护者建议使用一个mycookbook_test图案 - 单独的食谱保持所有的单元测试。这将允许一个简单的1 recipe-per-lwrp方法。

此外,这种方法可以让食谱清除任何单元测试,这对于食谱的消费者来说很好。消费者可能想要进行自己的单元测试,并且没有必要(或不希望)对第三方烹饪书进行测试。

+0

是。这正是我所说的:) – sethvargo