我开始为我的 Chef 食谱编写测试。我正在使用厨师规格对我的食谱进行单元测试。我需要在我的其中一台主机上安装 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
食谱无法安装最新的 chef-server 包。
我应该如何编写或模拟我的测试以便能够正确测试 Chef Server 是否安装成功?
答案1
因此,这很大程度上是由于一个名为OmnitruckClient
正在创建在 chef-server 默认配方中。OmnitruckClient 基本上是对 Omnitruck 端点的 HTTP 调用,旨在返回一个 URL,chef-server 配方随后会从该 URL 下载包。
我能想到有几种方法可以测试这种行为。
由于原生 ChefSpec 虚拟“平台”被命名为chefsepc
,Omnitruck 服务将绝不使用正确的 URL 链接进行响应,因此一种方法是向 Spec 测试提供平台和版本,以后可能会有其他值。
您可以在 RSpec 的常规配置或每个测试用例(甚至每个收敛)中提供这些选择。
我发现在 spec_helper.rb 文件中设置这些是最简单的。请参阅这里有关配置选项的更多信息。
另一种模式可能是尝试模拟/存根 OmnitruckClient 类(或它使用的 Net::HTTP.get 方法),但这似乎可能会更令人困惑,而且我实际上还无法让它发挥作用。