chefspec

ChefSpec: How to mock node.chef_environment?


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

Solution

  • 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.