要件
準備
前回使った apache_install にレシピを一つ追加する。
vim apache_install/recipe/hoge.rb
service "httpd" do supports :status => true, :restart => true, :reload => true action :nothing end # template "/tmp/hoge" do source "hoge.erb" mode "0644" owner "root" group "root" action :create variables( :hoge => node["hoge"] ) notifies :reload, "service[httpd]", :immediately end
試食
example
上記のレシピを受けて、下記のような example を作成した。
vi apache_install/spec/hoge.spec.rb
require 'chefspec' describe 'apache_install::hoge' do let (:chef_run) { ChefSpec::ChefRunner.new.converge 'apache_install::hoge' } #it 'should restart httpd' do # expect(chef_run).to restart_service 'httpd' #end it 'should set /tmp/hoge' do expect(chef_run).to create_file '/tmp/hoge' file = chef_run.template('/tmp/hoge') expect(file.mode).to eq("0644") expect(file).to be_owned_by('root','root') expect(file).to notify('service[httpd]',:reload) end end
テスト
テストしてみる。
rspec -fd --color apache_install
ハマったところ
undefined method `***' for nil:NilClass
当初、以下のように記載していたところ、undefined method `mode' for nil:NilClass と怒られ...ruby 力が低い自分は非常に悩んだ。
it 'should set /tmp/hoge' do expect(chef_run).to create_file '/tmp/hoge' file = chef_run.file('/tmp/hoge')
こちらを改めて読み返してみると...template の resource は下記のように書けとあった...
下記のように書きなおして undifined method を回避した。
it 'should set /tmp/hoge' do expect(chef_run).to create_file '/tmp/hoge' file = chef_run.template('/tmp/hoge')
まとめ
- cookbook_file と template で扱いは異なる
- レシピの中で異なるのだから、当然のことなのかもしれないが...
- ドキュメントは何度読んでも損は無い