2016-03-30 15 views
0

私はChefSpecを使用してレシピのテストを書こうとしています。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' 
    } 
) 

そして、私の仕様のようになります。私は、ノードを取得する方法を知りたい

NoMethodError 
------------- 
undefined method `[]' for nil:NilClass 
at line file node[:storm][:job_dir] + node[:storm_work_gen][:jar_name] do 

[:

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 

スペックはメッセージで失敗:storm_work_gen] [:jar_name] chefSpecが実行されたときenvファイルから

答えて

0

あなたはモック環境を設定していますが、あなたは行動していませんシェフに何かのためにそれを使用するよう伝えています。また、あなたはそれにデータを入れていません。あなたのファイル内の環境と同じ名前を持っていますが、2人はお互いに関係ありません。上記のコメントに基づいて、ノードの値を設定する方法の明確なこの解決策を探していたが、いなかった人のために

+0

が、私はノードのモックできる方法として理解しようとしています[:jar_name] receipeにchefSpecは、実行時に私はこれを行う方法を指摘することができます。 – user3394555

+0

私はテストのためにノードに直接設定します。 envスタブを取り除き、同じブロック内の 'node.set [:storm_work_gen] [:jar_name] = '何でも'を追加してください。 – coderanger

+0

ありがとう、これは動作します – user3394555

0

はここに、上記の例に基づい内訳です:最初は

describe 'storm_wlm_deploy::_artifact' do 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

更新:[:storm_work_gen] 私はモック後 describe 'storm_wlm_deploy::_artifact' do let(:chef_run) do ChefSpec::SoloRunner.new do |node| node.set[:storm_work_gen][:jar_name] = 'wlm-workgenerator-topology-0.0.1-SNAPSHOT.jar' 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

関連する問題