2016-01-08 5 views
0

У меня есть рецепт, который изменяет значение DataBag, и я пытаюсь написать для этого тест. Соответствующая часть рецепта:Как я могу проверить модификации data_bag в ChefSpec?

def get_deployment_data(data_bag_name) 
    data_bag_item(data_bag_name, 'deployment') 
end 

# Update master data bag 
master_deployment_data = get_deployment_data(node['data_bag']['master']) 
master_deployment_data['latest_build']['number'] = latest_build_number 
master_deployment_data['latest_build']['packages_path'] = latest_packages_path 
master_deployment_data.save 

и тест выглядит следующим образом:

require 'spec_helper' 

describe 'my_cookbook::configure_deployment' do 
    let(:chef_runner) do 
    ChefSpec::SoloRunner.new 
    end 

    let(:chef_node) do 
    chef_runner.node 
    end 

    let(:chef_run) do 
    chef_runner.converge(described_recipe) 
    end 

    context 'When all attributes are default' do 
# snip # 
    context 'in a specified environment' do 
# snip # 
     context 'with an assigned role' do 
# snip # 
     context 'equal to the deployment master role' do 
      data_item = { 'latest_build' => {} } 

      before do 
      stub_data_bag_item('my_data_bag', 'deployment').and_return(data_item) 
      allow_any_instance_of(Hash).to receive('save') 
      chef_run 
      end 

# snip # 

      it 'sets the master data bag build number correctly' do 
      expect(data_item['latest_build']['number']).to match(/an appropriate regex/) 
      end 

      it 'sets the master data bag packages path correctly' do 
      expect(data_item['latest_build']['packages_path']) 
       .to match(/an appropriate regex/) 
      end 
     end 
     end 
    end 
    end 
end 

Оба теста неудачу с ошибкой говорить «ожидается ноль, чтобы соответствовать/соответствующее регулярное выражение /», так что я угадайте, что что-то не так, как я обманываю Data_Bag_Item. Из других тестов, которые я удаляю из опубликованного кода, я знаю, что код в рецепте, который изменяет элемент пакета данных, фактически запущен.

Что мне не хватает?

ответ

1

Проблема, вероятно, в том, что система stubbing ChefSpec преобразует значения в Mash перед возвратом, что является операцией копирования. Вместо того, чтобы возвращать хэш из заглушки, используйте реальный экземпляр DataBagItem.

Также поместите элемент в переменную, пусть так оно лучше областью действия:

let(:data_item) do 
    Chef::DataBagItem.from_hash('latest_build' => {}).tap do |item| 
    expect(item).to receive(:save) 
    end 
end 
+0

Спасибо. Работал как шарм. –