Я начинаю писать тесты для своих кулинарных книг от шеф-повара. я использую ChefSpec для модульного тестирования моих кулинарных книг. Мне нужно установить Chef Server на одном из моих хостов, и я хотел бы написать для этого тест. Пока у меня есть:
Тестовый файл ChefSpec в spec/default_spec.rb
:
require 'chefspec'
require 'chefspec/berkshelf'
describe 'my_chef_server::default' do
let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
it 'includes the chef-server recipe' do
expect(chef_run).to include_recipe('chef-server')
end
end
А metadata.rb
файл, в котором говорится, что chef-server
поваренная книга - это зависимость.
depends 'chef-server'
А recipes/default.rb
который включает chef-server
рецепт блюда:
include_recipe 'chef-server'
Когда я запускаю свои тесты (используя rspec
) Я получаю сообщение об ошибке:
================================================================================
Recipe Compile Error in /var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/my_chef_server/recipes/default.rb
================================================================================
RuntimeError
------------
Could not locate chef-server package matching version 'latest' for node.
Cookbook Trace:
---------------
/var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/chef-server/recipes/default.rb:31:in `from_file'
/var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/my_chef_server/recipes/default.rb:11:in `from_file'
Relevant File Content:
----------------------
/var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/chef-server/recipes/default.rb:
24: node['chef-server']['nightlies']
25: )
26: unless omnibus_package
27: err_msg = 'Could not locate chef-server'
28: err_msg << ' pre-release' if node['chef-server']['prereleases']
29: err_msg << ' nightly' if node['chef-server']['nightlies']
30: err_msg << " package matching version '#{node['chef-server']['version']}' for node."
31>> fail err_msg
32: end
33: else
34: omnibus_package = node['chef-server']['package_file']
35: end
36:
37: package_name = ::File.basename(omnibus_package)
38: package_local_path = "#{Chef::Config[:file_cache_path]}/#{package_name}"
39:
40: # Ensure :file_cache_path exists
F.
Failures:
1) my_chef_server::default includes the chef-server recipe
Failure/Error: let(:chef_run) { ChefSpec::Runner.new.converge(described_recipe) }
RuntimeError:
Could not locate chef-server package matching version 'latest' for node.
# /var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/chef-server/recipes/default.rb:31:in `from_file'
# /var/folders/5g/dq2jk1sn30dgf7p4qhbvcjq80000gn/T/d20140429-77773-nxjusi/cookbooks/my_chef_server/recipes/default.rb:11:in `from_file'
# ./spec/default_spec.rb:6:in `block (2 levels) in <top (required)>'
# ./spec/default_spec.rb:9:in `block (2 levels) in <top (required)>'
Finished in 0.28717 seconds
2 examples, 1 failure
Failed examples:
rspec ./spec/default_spec.rb:8 # my_chef_server::default includes the chef-server recipe
Насколько я могу судить, ChefSpec правильно загружает и выполняет мою кулинарную книгу и запускает зависимый chef-server
Кулинарная книга. Однако ошибка показывает, что chef-server
cookbook не может установить последнюю версию пакета chef-server.
Как мне написать или смоделировать свой тест, чтобы я мог правильно проверить, что Chef Server установлен успешно?
Так что это во многом связано с новым экземпляром класса с именем OmnitruckClient
создается в рецепте по умолчанию для chef-server. OmnitruckClient - это, по сути, HTTP-вызов конечной точки Omnitruck, который предназначен для возврата URL-адреса, откуда рецепт шеф-сервера затем загрузит пакет.
Я могу придумать несколько способов справиться с тестированием этого поведения.
Поскольку нативная виртуальная «платформа» ChefSpec называется chefsepc
, сервис Omnitruck никогда ответьте правильной URL-ссылкой, поэтому одним из методов может быть предоставление платформы и версии для теста Spec, которые позже могут иметь другие значения.
Вы можете предоставить эти варианты выбора либо в общей конфигурации для RSpec, либо в каждом тестовом примере (или даже в каждом из них).
Я считаю, что проще всего установить их в файле spec_helper.rb. Видеть Вот для получения дополнительной информации о параметрах конфигурации.
Другой режим может заключаться в том, чтобы попытаться высмеять / заглушить класс OmnitruckClient (или метод Net :: HTTP.get, который он использует), но казалось, что это может быть немного более запутанным, и я пока не мог заставить это работать .