I would like to add RSpec unit tests to some Puppet 4 modules. To get started and confirm basic functioning, I would first like to run unit tests that come with standard Puppet modules such as puppetlabs/apt.
If I try running a specific unit test like so
cd modules/apt
rspec spec/classes/apt_spec.rb
I get only failures, and some of the diagnostic output seems to indicate that part of the Puppet runtime environment (such as module stdlib, which defines function merge) was not picked up correctly:
Failures:
1) apt defaults should contain File[sources.list] that notifies Class[Apt::Update]
Failure/Error:
it { is_expected.to contain_file('sources.list').that_notifies('Class[Apt::Update]').only_with({
:ensure => 'file',
:path => '/etc/apt/sources.list',
:owner => 'root',
:group => 'root',
:mode => '0644',
:notify => 'Class[Apt::Update]',
})}
Puppet::PreformattedError:
Evaluation Error: Unknown function: 'merge'. at /home/MY_USER/modules/apt/spec/fixtures/modules/apt/manifests/init.pp:50:14 on node MY_HOST
If I try running all unit tests like so
rake spec
I get this error message:
rake aborted!
NameError: uninitialized constant Bundler
/home/MY_USER/modules/apt/Rakefile:3:in `<top (required)>'
(See full trace by running task with --trace)
Prior to these attempts I have taken those steps to prepare the runtime environment (on a Debian host):
mkdir modules
cd modules
puppet module --modulepath=. install puppetlabs-apt # installs also stdlib
sudo gem install rspec-puppet
sudo gem install puppet
sudo gem install puppetlabs_spec_helper
sudo apt-get install rake
My question is this: How can I correctly prepare the runtime environment and successfully run the unit tests that come with a Puppet module from Puppet Forge such as puppetlabs/apt?
To do this you need to firstly ensure you have Ruby Gems installed. Then ensure you have installed bundler, which usually just means typing:
Next, I assume you already cloned the apt module, so cd into the directory you cloned it in and then install your bundle:
Now, there's a problem with that specific module you've chosen. When I try to run bundle install I get:
I am not sure what that means at the moment, and someone probably needs to raise a bug.
I expected to be able to work around it by using:
Even that is not working so I simply commented-out those groups.
Next, run the tests using:
That would normally run the tests. However, I think Puppet has broken the Rspec tests for people outside their company.
I am going to follow this up and come back and update the answer I have figured out what has happened.
I'll leave this answer here since it's still documenting the correct procedure.
See also my blog post on this subject, although possibly a little dated now. Let me know if there's anything I need to update.