I created my custom LWRP, but when I run the ChefSpec units test. It doesn't know my LWRP actions.
Here is my resource:
actions :install, :uninstall
default_action :install
attribute :version, :kind_of => String
attribute :options, :kind_of => String
Here is my provider:
def whyrun_supported?
true
end
action :install do
version = @new_resource.version
options = @new_resource.options
e = execute "sudo apt-get install postgresql-#{version} #{options}"
@new_resource.updated_by_last_action(e.updated_by_last_action?)
end
And here is my ChefSpec unit test:
require_relative '../spec_helper'
describe 'app_cookbook::postgresql' do
let(:chef_run) do
ChefSpec::Runner.new do |node|
node.set[:app][:postgresql][:database_user] = 'test'
node.set[:app][:postgresql][:database_password] = 'test'
node.set[:app][:postgresql][:database_name] = 'testdb'
end.converge(described_recipe)
end
it 'installs postgresql 9.1 package' do
expect(chef_run).to run_execute('sudo apt-get install postgresql-9.1 -y --force-yes')
end
end
Here is the console output:
app_cookbook::postgresql
expected "execute[sudo apt-get install postgresql-9.1 -y --force-yes] with" action :run to be in Chef run. Other execute resources:
./spec/recipes/postgresql_spec.rb:23:in `block (2 levels) in <top (required)>'
installs postgresql 9.1 package (FAILED - 1)
Failures:
1) app_cookbook::postgresql installs postgresql 9.1 package
Failure/Error: expect(chef_run).to run_execute('sudo apt-get install postgresql-9.1 -y --force-yes')
expected "execute[sudo apt-get install postgresql-9.1 -y --force-yes] with" action :run to be in Chef run. Other execute resources:
# ./spec/recipes/postgresql_spec.rb:23:in `block (2 levels) in <top (required)>'
1 example, 1 failure, 0 passed
How can I say to ChefSpec that run the test with the LWRPs actions?
You need to tell chefspec to step into your resource. You can do this as follows:
require_relative '../spec_helper'
describe 'app_cookbook::postgresql' do
let(:chef_run) do
ChefSpec::Runner.new(step_into: ['my_lwrp']) do |node|
node.set[:app][:postgresql][:database_user] = 'test'
node.set[:app][:postgresql][:database_password] = 'test'
node.set[:app][:postgresql][:database_name] = 'testdb'
end.converge(described_recipe)
end
it 'installs postgresql 9.1 package' do
expect(chef_run).to run_execute('sudo apt-get install postgresql-9.1 -y --force-yes')
end
end
You can replace my_lwrp with the resource which you want to step into.
For more details, see the Testing LWRPS section in the Chefspec repo README.
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With