Ruby 存根include_recipe调用以不采取任何操作,但仍将配方计算为已包含

Ruby 存根include_recipe调用以不采取任何操作,但仍将配方计算为已包含,ruby,rspec,chef-infra,chefspec,Ruby,Rspec,Chef Infra,Chefspec,我的烹饪书的默认食谱只包括几个其他食谱。我知道我可以使用以下方法测试是否包含适当的配方: expect(chef\u run)。包括“菜谱”菜谱::菜谱名称 但是当我像这样打断了include_recipe调用时,这就不起作用了 Chef::Recipe.any_实例.stub(:include_Recipe).with(anything).and_return(true) 我正在删除include_recipe调用,因为我不想在这个规范中为我所有的食谱定义所有缺少的属性 我想,通过将方法返回到

我的烹饪书的默认食谱只包括几个其他食谱。我知道我可以使用以下方法测试是否包含适当的配方:

expect(chef\u run)。包括“菜谱”菜谱::菜谱名称

但是当我像这样打断了include_recipe调用时,这就不起作用了

Chef::Recipe.any_实例.stub(:include_Recipe).with(anything).and_return(true)

我正在删除include_recipe调用,因为我不想在这个规范中为我所有的食谱定义所有缺少的属性


我想,通过将方法返回到<代码>真< /代码> CHEFSPEC将报告它已经运行并考虑包含的配方,但它没有。有什么想法吗?

我本来想把上面的问题作为一个问题发布,但我在github上发现了一个由“RoboticCheese”发布的帖子,所以我回答了自己的问题,因为这可能会帮助其他人


您确实需要如上所述存根include recipe,但是您还需要存根一些RunContext方法来计算已包含的配方。

如果您想确保使用正确的配方调用
include\u recipe
,但不想加载所包含配方中的资源,我想我有一个更新且更干净的解决方案:

before(:all){@included_recipes=[]}
在做之前
@存根食谱=%w[测试食谱::包括食谱apt]
@短梗食谱。每个都做|
允许(厨师::菜谱)的任何实例接收(:包含菜谱)。使用(r)do

@包含的食谱请将您的答案标记为正确。只需添加,如果您的食谱使用的是另一本烹饪书中定义的LWRPs,删除“depends”将导致ChefSpec::Runner无法找到它们,并指出根据您所寻找的隔离级别,删除可能是可取的。
before(:all) { @included_recipes = [] }
before do
  @stubbed_recipes = %w[test_cookbook::included_recipe apt]
  @stubbed_recipes.each do |r|
    allow_any_instance_of(Chef::Recipe).to receive(:include_recipe).with(r) do
      @included_recipes << r
    end
  end
end

it 'includes the correct recipes' do
  chef_run
  expect(@included_recipes).to match_array(@stubbed_recipes)
end