2

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

expect(chef_run).to include_recipe 'cookbook::recipe_name

但是当我像这样对 include_recipe 调用进行存根时,这不起作用

Chef::Recipe.any_instance.stub(:include_recipe).with(anything).and_return(true)

我正在对 include_recipe 调用进行存根,因为我不想在这个规范中为我的所有食谱定义所有缺失的属性。

我原以为通过存根返回trueChefSpec 的方法会报告它已运行并考虑包含的食谱,但事实并非如此。有任何想法吗?

4

2 回答 2

1

我打算在上面发布一个问题,但我在 github 上找到了“RoboticCheese”发布的解决方案,所以我正在回答我自己的问题,因为它可能对其他人有所帮助。

您确实如上所述存根包含配方,但您还需要存根一些 RunContext 方法以将配方计为已包含。

于 2013-06-19T17:25:04.933 回答
1

如果您想确保include_recipe使用正确的配方调用,但不想在包含的配方中加载资源,我认为我有一个更新和更清洁的解决方案:

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

一个完整的例子:https ://github.com/atheiman/test-cookbook/pull/4

于 2017-11-15T15:48:25.983 回答