Как проверить модификации data_bag в ChefSpec?

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

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

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

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


person Andrew Cooper    schedule 08.01.2016    source источник


Ответы (1)


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

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

let(:data_item) do
  Chef::DataBagItem.from_hash('latest_build' => {}).tap do |item|
    expect(item).to receive(:save)
  end
end
person coderanger    schedule 08.01.2016
comment
Спасибо. Работал как шарм. - person Andrew Cooper; 08.01.2016