2014-01-16 2 views
5

Как написать единичный тест для поставщика шеф-повара?Единичное тестирование поставщика шеф-повара

До сих пор наша стратегия тестирования устройств использовала для рецептов ChefSpec, и мы используем большую часть интересной логики для наших поставщиков в библиотеках, чтобы сделать логику более пригодной для тестирования. Тем не менее, мы все еще сталкиваемся с проблемами, когда наши провайдеры называют другие ресурсы (среди других простых логических проблем). Например:

action :run do 

    helper = Helper.new 
    template '/etc/hosts' do 
    source 'hosts.erb' 
    variables ({ 
       "host" => @new_resource.host, 
       "ip_address" => node['ipaddress'] 
      }) 
    only_if { helper.update_hosts } 
    end 

    service 'httpd' do 
     action :restart 
    end 
end 

(это не реальный код, просто тривиальный пример)

То, что мы хотели бы сделать, это проверить этот провайдер в изоляции, чтобы проверить наличие логических ошибок. ChefSpec имеет возможность вступать в LWRP, но похоже, что это заставило бы нас поместить LWRP в рецепт, а многие из наших поваренных книг - это в основном библиотеки LWRP без рецептов. Мы также хотели бы сохранить чистое разделение в наших тестах, поэтому очевидно, какой компонент вышел из строя, посмотрев имя файла.

Кроме того, было бы неплохо, если бы тест автоматически потерпел неудачу, если в определении LWRP имеются синтаксические ошибки. Например:

action :run do 
    template '/etc/hosts/' do 
    source_whoops 'hosts.erb' 
    action :whoops 
    end 
end 

Было бы очень хорошо, если приведенное выше утверждение может вызвать сбой при проверке в связи с именем атрибута определяется неправильно, и имя действия не существует (так же, как ChefSpec).

Единственное решение, с которым я столкнулся, состоит в том, чтобы создать «тестовую кулинарию» - отдельную кулинарную книгу, которая определяет каждый LWRP 1: 1 с помощью одного рецепта, поэтому ChefSpec может войти в него таким образом. Это похоже на разумное, но не идеальное решение.

ответ

6

Похоже, что существует (очень недавнее) решение.

Во-первых, this pull request будет в основном делать то, о чем я прошу, хотя по понятным причинам он был отклонен сторонником ChefSpec.

Составитель предлагает использовать шаблон mycookbook_test - отдельная кулинарная книга хранит все модульные тесты. Это позволило бы использовать простой подход 1 рецепт-на-lwrp.

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

+0

Да. Это именно то, что я сказал :) – sethvargo

Смежные вопросы