2013-08-26 1 views
4

У меня есть следующий создание файла шаблона в моей кулинарной книге:Test инициализация файла на основе шаблона от использования ChefSpec

template "my_file" do 
    path "my_path" 
    source "my_file.erb" 
    owner "root" 
    group "root" 
    mode "0644" 
    variables(@template_variables) 
    notifies :restart, resources(service: "my_service") 
end 

и следующие утверждения в моих ChefSpec тестов:

chef_run.should create_file "my_file" 
    chef_run.file("my_file").should be_owned_by('root', 'root') 

что приводит следующий отказ:

No file resource named 'my_file' with action :create found. 

Это связано с тем, что я не пользуюсь file ресурс, но template ресурс. Вопрос: Как я могу проверить создание файла с помощью ресурса шаблона с помощью ChefSpec?

+0

Вы когда-нибудь находите решение своей проблемы? Синтаксис для помощников ChefSpec изменился с момента публикации этого вопроса. Отвечает ли данный ответ на вашу проблему? – sethvargo

+0

o Прошу прощения, я полностью забыл об этом вопросе. Собираюсь перепроверить, что посмотреть и посмотреть –

ответ

7

Существует два способа решить вашу проблему.

Во-первых, вы можете использовать сопряжение create_template. Это будет соответствовать только «шаблону» ресурсы в контексте выполнения:

expect(chef_run).to create_template('my_file') 

Это согласовань также цепная, так что вы можете утверждать атрибуты:

expect(chef_run).to create_template('my_file') 
    .with_path('my_path') 
    .with_owner('root') 

Однако это согласовани не фактически визуализации шаблон. Таким образом, вы не можете проверить, правильно ли вы настроили файловую спецификацию.

Там также верхний уровень согласовань для любого типа «файл» (file, cookbook_file и template), что на самом деле делает содержимое памяти:

expect(chef_run).to render_file('my_file').with_content(/^match me$/) 

Вы можете найти более подробную информацию о render_file in the README.

+0

Качество моего chefspec только увеличилось в 3 раза. Можно ли использовать несколько set_content? 'должен render_file ('somefile'). with_content (/ content1 /). with_content (/ content2 /)' соответствует только 2-му регулярному выражению, никогда не разбирает первый. – Brett

+0

Нет, with_content не является аддитивным соглашением. – sethvargo

+0

, поэтому подход для тестирования нескольких совпадений содержимого заключался бы в присвоении переменной '.to render_file ('myfile')' переменной и последующему запуску with_content против этого. – Brett

5

Согласно документации (https://github.com/acrmp/chefspec), вы должны быть в состоянии использовать:

expect(chef_run).to create_file 'my_file' 

Я думаю, что что-то изменилось совсем недавно (возможно, версия chefspec на RubyGems), однако, потому что испытания я проходя ранее сегодня (используя тот же синтаксис, который вы используете) теперь неожиданно перестают работать.