Инициализация тестового файла на основе шаблона с использованием 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?

2 ответа

Решение

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

Во-первых, вы можете использовать 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 в README.

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

expect(chef_run).to create_file 'my_file'

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

Другие вопросы по тегам