我正在尝试使用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中不存在。
答案 0 :(得分:0)
您需要存根创建的类:
let(:my_double) { double('opsworks_deploy') }
Chef::Resource::OpsworksDeploy.stub(:new).and_return(my_double)