4

我正在尝试使用 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一个空的提供者来提供外部提供者模拟来模拟这个。虽然显然正在生成资源和提供者,但它显然没有在应有的位置注册,因为测试仍然抱怨缺少外部提供者。

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

如果需要更多上下文,可以在此处找到有问题的提供者: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

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

4

1 回答 1

0

您需要存根创建的类:

let(:my_double) { double('opsworks_deploy') }
Chef::Resource::OpsworksDeploy.stub(:new).and_return(my_double)
于 2014-03-19T23:38:23.613 回答