2014-03-19 33 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的作用,但它显然不是。 –