ChefSpec: How to mock node.chef_environment?

172 Views Asked by At

Does anyone know how to mock the node attribute "node.chef_environment" in chefspec?

template 'my_script.sh' do
 source 'my_script.erb'
 variables(
  environment: node.chef_environment
 )
end

Unfortunately, mocking via default_attributes does not work.

describe "my_test" do
  context "create template file" do 
     default_attributes['chef_environment']= 'my_env'
     it { is_expected.to render_file('my_script.sh').with_content('env=my_env')}
  end
end
1

There are 1 best solutions below

0
Andy Foster On BEST ANSWER

You have to mock out Chef's Environment class and construct a runner with it.

cached(:chef_run) do
  ChefSpec::SoloRunner.new do |node|
    env = Chef::Environment.new
    env.name 'my-fake-env'
    allow(node).to receive(:chef_environment).and_return(env.name)
    allow(Chef::Environment).to receive(:load).and_return(env)
  end.converge(described_recipe)
end

Here is a good discussion on the topic.