2015-08-11 1 views
1

Я пытаюсь создать тест спецификации для следующего кода рецепта:заглушка node.attribute? в 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?' ? Спасибо.

ответ

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 

Spec:

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-statement.

+0

Спасибо Мартину, мы отошли и использовали другой подход в нашем рецепте, так что это уже не проблема. – user3005011