ChefSpec - Unable to set node attributes
Asked Answered
S

1

6

I have a simple test for the nginx cookbook:

require 'spec_helper'

describe 'my_cookbook::nginx' do
  let(:chef_run) do
    ChefSpec::Runner.new do |node|
      node.set['nginx']['dir'] = '/etc/nginx'
    end.converge(described_recipe)
  end

  it 'should create configuration directory' do
    expect(chef_run).to create_directory("#{node['nginx']['dir']}")
  end

end

Which is failing:

Failures:

  1) my_cookbook::nginx should create configuration directory
     Failure/Error: expect(chef_run).to create_directory("#{node['nginx']['dir']}")
     NameError:
       undefined local variable or method `node' for #<RSpec::Core::ExampleGroup::Nested_1:0x00000007993570>

I'm attempting to set the node attributes as described in the docs, is there something obvious I'm missing?

Stanchion answered 13/2, 2014 at 18:39 Comment(0)
V
10

You are able to set node attributes. If you look at the stacktrace, it's complaining about this line:

expect(chef_run).to create_directory("#{node['nginx']['dir']}")

Specifically, #{node['nginx']['dir']}. You should use a static value here, otherwise your test is pointless. Change it to:

expect(chef_run).to create_directory('/etc/nginx')
Velamen answered 13/2, 2014 at 19:13 Comment(2)
Direct from the author! Thanks, Seth!Stanchion
Seth, why then this is working for me expect(chef_run).to create_directory("#{Chef::Config[:file_cache_path]}/jdk/") But I have problem with my default attribute. I expect that resources, that are wrapped around IF, be executed, but they aren't. My node attribute is set to TRUE, but when running RSpec, it fails. Real test (kitchen test) is fine.Softspoken

© 2022 - 2024 — McMap. All rights reserved.