Chef infra 断言厨师运行包括来自另一本烹饪书的食谱

Chef infra 断言厨师运行包括来自另一本烹饪书的食谱,chef-infra,cookbook,Chef Infra,Cookbook,运行输出未触及的资源:用于栏中的所有资源cookbook。 我遵循了断言,但它使用了允许任何的实例,这可能不是最佳实践。 我使用它的方式如下: $ cat Gemfile | grep "'chefspec'\|'chef'" gem 'chef', '12.8.1' gem 'chefspec', '4.6.1' $ cat cookbooks/foo/recipes/default.rb | grep include include_recipe 'bar' $ cat cook

运行输出
未触及的资源:
用于
栏中的所有资源
cookbook。 我遵循了断言,但它使用了
允许任何
的实例,这可能不是最佳实践。
我使用它的方式如下:

$ cat Gemfile | grep "'chefspec'\|'chef'"
  gem 'chef', '12.8.1'
  gem 'chefspec', '4.6.1'

$ cat cookbooks/foo/recipes/default.rb | grep include
include_recipe 'bar'

$ cat cookbooks/foo/metafata.rb | grep depends
depends 'bar'
但是,当我运行时,我得到以下错误:

$ cat cookbook/foo/spec/recipes/default_spec.rb
describe 'foo::default' do
  cached(:chef_run) { ChefSpec::ServerRunner.converge(described_recipe) }
  let(:recipe) { instance_double(Chef::Recipe, cookbook_name: 'foo', recipe_name: 'default') }

  before do
    allow_any_instance_of(Chef::Recipe).to receive(:include_recipe).and_call_original
    allow_any_instance_of(recipe).to receive(:include_recipe).with('bar')
  end

  it 'includes recipes' do
    expect_any_instance_of(recipe).to receive(:include_recipe).with('bar')
  end
end
foo::default
包括配方(失败-1)
失败:
1) foo::默认包括菜谱
失败/错误:允许(配方)的任何实例接收(:包含配方)。带有('bar')
#收到意外消息:具有(无参数)的祖先
#./vendor/cookbooks/foo/spec/recipes/default_spec.rb:32:in'block(2级)in'
在2.22秒内完成(加载文件需要1.72秒)
1例,1例失败
失败的示例:
rspec./vendor/cookbooks/foo/spec/recipes/default#u spec.rb:43#foo::default包括菜谱
我们能否阐明这一问题:

  • chefspec能运行所有随附食谱的规格吗?如果是,如何配置我
  • 如果前一个不可能,我如何修复上面的问题并消除包含的烹饪书的聚合(将其他烹饪书视为黑盒)
  • 更新:

    还尝试了无效的解决方案,并返回了另一个错误:

    foo::default
      includes recipes (FAILED - 1)
    
    Failures:
    
      1) foo::default includes recipes
         Failure/Error: allow_any_instance_of(recipe).to receive(:include_recipe).with('bar')
           #<InstanceDouble(Chef::Recipe) (anonymous)> received unexpected message :ancestors with (no args)
         # ./vendor/cookbooks/foo/spec/recipes/default_spec.rb:32:in `block (2 levels) in <top (required)>'
    
    Finished in 2.22 seconds (files took 1.72 seconds to load)
    1 example, 1 failure
    
    Failed examples:
    
    rspec ./vendor/cookbooks/foo/spec/recipes/default_spec.rb:43 # foo::default includes recipes
    
    foo::default
    包括配方(失败-1)
    失败:
    1) foo::默认包括菜谱
    失败/错误:允许(配方)。接收(:祖先)。并返回(真)
    Recipe类没有实现实例方法:祖先。也许你想用'class_double'来代替?
    #./vendor/cookbooks/foo/spec/recipes/default_spec.rb:31:in'block(2级)in'
    #./vendor/cookbooks/foo/spec/recipes/default_spec.rb:37:in'block(2级)in'
    在1.33秒内完成(加载文件需要1.4秒)
    1例,1例失败
    失败的示例:
    rspec./vendor/cookbooks/foo/spec/recipes/default#u spec.rb:48#foo::default包括菜谱
    
    摘自Tensibai评论:


    如果我理解正确,您真正希望的是从覆盖率报告中排除“bar”cookbook资源,为此,使用coverage.start中的add_filter将其记录在自述文件的覆盖率部分!块Chefspec不为包含的cookbook加载测试,我不知道这样做的方法,包括helpers/stub可能是一个想法,但在我看来这太多猜测了


    如果我理解正确,您真正希望的是从覆盖率报告中排除“bar”烹饪书资源,为此,在自述文件的覆盖率部分中使用
    add\u filter
    记录在
    coverage.start块。Chefspec不会为包含的烹饪书加载测试,我不知道如何做到这一点,包括助手/存根可能是一个想法,但在我看来,这太多猜测了。@Tensibai:首先感谢您的回复。注意,添加一个过滤器并不意味着菜谱将不在运行列表中,它只是不在覆盖率报告中,这意味着为包含的菜谱(
    bar
    ,在我们的例子中)创建的存根\模拟必须复制到菜谱中,包括其他菜谱(
    foo
    ,在我们的例子中),我们认为代码重复很糟糕。如果我的所有私人食谱都有一个
    spec\u helper
    ,则需要根据每个食谱修改全局或中央设置的过滤器。你还有其他想法吗?ChefSpec是“以烹饪书为中心的”,你不应该为许多烹饪书提供一个通用的spec_助手。假设你知道你在做什么,你可以依次要求其他食谱规格。阻止包装好的cookbook资源运行通常是一种错误的模式,因为您可能也会错过对资源的覆盖。So tl;博士您必须有代码复制,这并不是那么糟糕,因为它会告诉您包装好的烹饪书的更新是否破坏了您的功能;)@Tensibai:我已经利用了您在之前的评论中提供的内容—在centric
    spec\u helper
    中,我扩展了我的自定义过滤器,以拥有一个类(静态)变量,该变量包含一个排除列表,并且该变量可以从外部访问(从特定的spec中)。我想你把我带到这里了。。。我想给你一个关于潜在客户的信用,所以请将你的评论转换为答案,这样我就可以将其标记为已解决。你应该写下自己的答案,其中包含解决问题的细节,我只是在这里给出了一些提示;)
    foo::default
      includes recipes (FAILED - 1)
    
    Failures:
    
      1) foo::default includes recipes
         Failure/Error: allow(recipe).to receive(:ancestors).and_return(true)
           the Chef::Recipe class does not implement the instance method: ancestors. Perhaps you meant to use `class_double` instead?
         # ./vendor/cookbooks/foo/spec/recipes/default_spec.rb:31:in `block (2 levels) in <top (required)>'
         # ./vendor/cookbooks/foo/spec/recipes/default_spec.rb:37:in `block (2 levels) in <top (required)>'
    
    Finished in 1.33 seconds (files took 1.4 seconds to load)
    1 example, 1 failure
    
    Failed examples:
    
    rspec ./vendor/cookbooks/foo/spec/recipes/default_spec.rb:48 # foo::default includes recipes