我正在开始为我的厨师烹饪书写testing。 我正在使用ChefSpec来testing我的食谱。 我需要在我的一台主机上安装Chef Server,我想写一个testing。 到目前为止我有:
spec/default_spec.rb ChefSpectesting文件:
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'
当我运行我的testing(使用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食谱不能安装最新的厨师服务器包。
我应该如何编写或模拟我的testing,以便我可以正确testing厨师服务器安装成功?
所以这主要是由于在厨师服务器默认配方中创build了一个名为OmnitruckClient的类的新实例。 OmnitruckClient基本上是一个到Omnitruck端点的HTTP调用,这意味着返回一个URL,然后厨师服务器配方将从那里下载包。
处理这种行为的testing有几种方法可以考虑。
由于本地ChefSpec虚拟“平台”被命名为chefsepc ,因此Omnitruck服务将永远不会用正确的URL链接进行响应,所以一种方法就是为Spectesting提供一个平台和版本,以后可能会有其他值。
您可以在RSpec的常规configuration中提供这些select,也可以在每个testing用例(甚至每个收敛)中提供这些select。
我发现在spec_helper.rb文件中设置它们是最简单的。 有关configuration选项的更多信息,请参阅此处 。
另一种模式可能是尝试嘲弄/剔除OmnitruckClient类(或其使用的Net :: HTTP.get方法),但似乎这可能会更混乱一点,我实际上无法让它工作。