stub node.attribute?在chefspec

时间:2015-08-11 12:06:10

标签: unit-testing chef cookbook chefspec

我正在尝试为以下配方代码创建规范测试:

    if node.attribute?(node['tested_cookbook']['some_attribute'])
       include_recipe('tested_cookbook::first')
    else
       include_recipe('tested_cookbook::second')

我有以下规范:

    require 'spec_helper'

    describe 'tested_cookbook::default' do

    let(:chef_run) { ChefSpec::SoloRunner.new(platform: 'windows', version: '2008R2') do |node|
    node.set['tested_cookbook']['some_attribute'] = "some_value"
    end.converge(described_recipe) }

      it 'includes recipe iis' do
         expect(chef_run).to include_recipe('tested_cookbook::first')
      end
    end

问题是这个测试总是会失败。 如何正确模拟'node.attribute?'的结果? ? 谢谢。

1 个答案:

答案 0 :(得分:0)

我不确定你可以在没有猴子补丁的情况下覆盖Chefspec中的节点对象,我认为这可能比它的价值更麻烦。我几乎从来没有看到node.attribute?使用过,所以它可能有点像反模式。 (你真的关心如果它被设置了,那么它是否具有非零值?)

我首先要避免使用attribute?,例如

配方:

if node['tested_cookbook'] && node['tested_cookbook']['some_attribute'])
   include_recipe('tested_cookbook::first')
else
   include_recipe('tested_cookbook::second')
end

规格:

require 'spec_helper'

describe 'tested_cookbook::default' do

let(:chef_run) { ChefSpec::SoloRunner.new(platform: 'windows', version: '2008R2') do |node|
node.set['tested_cookbook']['some_attribute'] = "some_value"
end.converge(described_recipe) }

  it 'includes recipe iis' do
     expect(chef_run).to include_recipe('tested_cookbook::first')
  end
end

通常的做法是给这些属性一个默认值,所以说:

更为惯用

属性/ default.rb:

default['tested_cookbook']['some_attribute'] = 'second'

配方:

include_recipe "tested_cookbook::#{node['tested_cookbook']['some_attribute']}"

然后在您的规范中,执行与以前相同的检查。您正在使用一个属性来运行:: second,但允许某人将其覆盖为:: first。如果你不喜欢实际使用属性值的模式,你可以把它作为一个标志并保留你以前的if语句。