2014-11-09 5 views
2

Если у меня есть рецепт шеф-повара со следующим атрибутомchefspec ресурс тестирования с петлями

node.default["cookbook"]["directory"] = %w(/mnt/directory1 /mnt/directory2) 

    node["cookbook"]["directory"].each do |dir| 
     directory dir do 
     owner "user" 
     mode 0644" 
     action :create 
     end 
    end 

Как бы я написать chefspec тест, который обрабатывает массив каталогов, которые будут созданы на основе атрибута?

Благодарим за помощь.

ответ

1
expect(chef_run).to create_directory('/mnt/directory1') 
expect(chef_run).to create_directory('/mnt/directory2') 
+0

FWIW Это нарушение СУХОЙ. Следующий ответ более идиоматичен и предпочтительнее. – feoh

+0

Тестовый код должен повториться, ясность и простота важнее, чем простота рефакторинга. – coderanger

2

Вы также мог бы сделать

%w(/mnt/directory1 /mnt/directory2).each do |dir| 
    expect(chef_run).to create_directory(dir) 
end 

UPDATE: К сожалению, немного больше опыта, и теперь я могу дать вам лучший ответ.

Да, вышеуказанные работы, но если вы действительно хотите сделать это здорово, это сделать ...

my_directories = %w(/test/1 /other_test/2) 

let(chef_run) do 
    ChefSpec::SoloRunner.new do |node| 
    node.default["cookbook"]["directory"] = my_directories 
    end.converge(described_recipe) 
end 

my_directories.each do |dir| 
    expect(chef_run).to create_directory(dir) 
end 

Это позволит вам сохранить список каталогов и тесты вместе в одном файле , Если список в вашем attributes.rb должен был измениться, он не нарушил бы тест. Он также позволяет использовать полностью фиктивные имена для тестовых каталогов, которые я считаю полезными.