我正在尝试为以下配方代码创建规范测试:
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?'的结果? ? 谢谢。
答案 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语句。