2014-03-19 35 views
4

我正在嘗試使用ChefSpec測試廚師中的供應商。在這個提供者中,我打電話給另一個外部提供者,我想嘲笑/禁用,這樣只有我的提供者正在執行,而不是外部提供者。嘲笑chefspec中的外部供應商

我的供應商基本上是這樣的:

action :deploy do 
    app = new_resource.app 
    deploy_data = new_resource.deploy_data 

    opsworks_deploy do 
    deploy_data deploy_data 
    app app 
    end 

    Chef::Log.debug("This is where the actual code to test is located.") 

end 

我想我可以用Chef::Provider::LWRPBase.build_from_file與空提供商提供外部提供模擬莫名其妙地嘲笑這一點。雖然顯然有一個資源和提供者正在生成,但它顯然沒有註冊到它應該在的地方,因爲測試仍然抱怨缺少外部提供者。

任何想法,提示或示例都會非常棒 - 我發現提供者測試的所有示例都使用了更簡單和自包含的提供者,因此他們在這裏沒有真正的幫助。

如果需要更多的背景下,有問題的供應商是在這裏找到:https://github.com/fh/easybib-cookbooks/blob/0a9f7935371d6dc89796e83041cf5092bd96167a/easybib/providers/deploy.rb和我的測試中(蹩腳的,非工作,正在進行verision工作)是在這裏:https://github.com/fh/easybib-cookbooks/blob/0a9f7935371d6dc89796e83041cf5092bd96167a/easybib/spec/easybib_deploy_spec.rb

編輯:基本上,這裏的問題不是如何用存根「覆蓋」我的食譜中的現有提供者,而是如何以編程方式在ChefSpec運行期間創建並提供提供者,這在我正在測試的食譜中不存在。

回答

0

您需要存根創建類:

let(:my_double) { double('opsworks_deploy') } 
Chef::Resource::OpsworksDeploy.stub(:new).and_return(my_double) 
+0

這裏的問題是在Opsworks特定的場景,在這裏你基本上有兩種不同的菜譜庫 - 你自己和opsworks提供一個。由於'opsworks_deploy'在opsworks中,因此會失敗,因爲'未初始化的常量Chef :: Resource :: OpsworksDeploy'。當我試圖在我自己的食譜資源庫中存儲其中一個資源時,這是完美的。 你有沒有提示如何實際「創建」Chef :: Resource :: OpsworksDeploy?我希望這是LWRPBase.build_from_file的作用,但它顯然不是。 –