2014-01-16 144 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