在chefspec中模拟外部提供商

时间:2014-03-19 16:09:42

标签: chef chefspec

我正在尝试使用ChefSpec测试Chef中的提供程序。在这个提供程序中,我正在调用另一个外部提供程序,我想模拟/禁用它,以便只执行我的提供程序,而不是外部提供程序。

我的提供商基本上是这样的:

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与空提供程序来提供外部提供程序mock来以某种方式模拟此操作。虽然显然有一个资源和提供程序正在生成,但它显然没有注册到它应该的位置,因为测试仍然抱怨外部提供程序丢失。

任何想法,提示或示例都会很棒 - 我发现提供商测试的所有示例都使用简单且自包含的提供程序,因此它们在这里并没有真正帮助。

如果需要更多上下文,可以在此处找到相关提供商:https://github.com/fh/easybib-cookbooks/blob/0a9f7935371d6dc89796e83041cf5092bd96167a/easybib/providers/deploy.rb我的测试中的(糟糕的,非工作的,正在进行的工作中)https://github.com/fh/easybib-cookbooks/blob/0a9f7935371d6dc89796e83041cf5092bd96167a/easybib/spec/easybib_deploy_spec.rb

编辑:基本上,这里的问题不是如何"覆盖"我的cookbook中的现有Provider有一个存根,但是如何在ChefSpec运行期间以编程方式创建和提供提供程序,这在我正在测试的cookbook中不存在。

1 个答案:

答案 0 :(得分:0)

您需要存根创建的类:

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