我正在尝试使用ChefSpec为我的食谱编写一些测试。
这是我要测试的一段代码:
file node[:storm][:job_dir] + node[:storm_work_gen][:jar_name] do
owner node[:storm][:user]
group node[:storm][:user]
action :delete
only_if { File.exist? node[:storm][:job_dir]+node[:storm_work_gen][:jar_name] }
end
此处node[:storm_work_gen][:jar_name]
的值来自环境文件。我的env文件的内容是:
# coding: UTF-8
name 'sro_work_gen_dev'
description 'Sro Work Generator Environment for dev cluster'
override_attributes()
default_attributes(
storm_work_gen: {
cache_prop: {
expire_time: '30',
max_record_size: '100'
},
parallelism_hint: {
kafka_spout_brq_sfq_ph: '1',
kafka_spout_ftl_ph: '1',
data_marshaller_ph: '1',
data_processor_ph: '1',
item_lookup_ph: '1',
rule_applier_ph: '1',
worlist_writer_ph: '1'
},
num_workers: '2',
Topology_Name: 'WorkGen-tplgy-json-version',
Kafka_Zookeepers: '...',
Kafka_Broker: '...',
repo_url: '...',
jar_name: 'wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar'
}
)
我的规格看起来像这样:
describe 'storm_wlm_deploy::_artifact' do
# let(:chef_run) { ChefSpec::SoloRunner.new.converge(described_recipe) }
let(:chef_run) do
ChefSpec::SoloRunner.new do |node|
env = Chef::Environment.new
env.name 'storm_work_gen'
allow(node).to receive(:chef_environment).and_return(env.name)
allow(Chef::Environment).to receive(:load).and_return(env)
end.converge(described_recipe)
end
it 'delete the jar:/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar if it exists' do
expect(chef_run).to delete_file('/opt/swlm/storm_jobs/wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar')
end
end
规范失败并显示消息:
NoMethodError
-------------
undefined method `[]' for nil:NilClass
at line file node[:storm][:job_dir] + node[:storm_work_gen][:jar_name] do
我想知道当chefSpec运行时如何从env文件中获取node [:storm_work_gen] [:jar_name]
答案 0 :(得分:0)
您正在设置模拟环境,但实际上您并没有告诉Chef将其用于任何事情。您也没有在其中添加任何数据。虽然它与文件中的环境名称相同,但两者之间没有任何关系。