Chef infra 在chefspec中模拟外部提供程序

Chef infra 在chefspec中模拟外部提供程序,chef-infra,chefspec,Chef Infra,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

我正在尝试使用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\u from_file
和一个空的提供程序来模拟它,以提供外部提供程序模拟。虽然显然有一个资源和提供者正在生成,但它显然没有注册到它应该在的地方,因为测试仍然抱怨外部提供者丢失

任何想法、提示或示例都非常棒——我发现的所有提供程序测试示例都使用了更简单和自包含的提供程序,所以它们在这里并没有真正的帮助

如果需要更多的上下文,可以在这里找到有问题的提供者:我的测试的(蹩脚的、不工作的、正在工作的验证)在这里:


编辑:基本上,这里的问题不是如何用存根“覆盖”我的烹饪书中现有的提供者,而是如何在ChefSpec运行期间以编程方式创建和提供提供者,这在我正在测试的烹饪书中不存在。

您需要存根创建的类:

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

这里的问题是在Opsworks特定的场景中,您基本上有两个不同的cookbook存储库—您自己的和Opsworks提供的一个。由于
opsworks\u deploy
位于opsworks部署中,因此使用“uninitialized constant Chef::Resource::OpsworksDeploy”失败。当我试图将其中一个资源存根到我自己的烹饪书存储库中时,这种方法非常有效。您是否知道如何实际“创建”
Chef::Resource::OpsworksDeploy
?我希望这是LWRPBase.build_from_文件所做的,但显然不是。您可能希望在spec_帮助程序或spec/library/helpers.rb中创建一个与您正在模拟的资源具有相同名称/类型的模拟对象,然后让它为您尝试访问的特定方法返回值。您还可以覆盖这些值,类似于存根示例的显示方式。