ようへいの日々精進XP

よかろうもん

cookbook テストツール ChefSpec を使ってみた一部始終(2)

要件

  • cookbook をテストするツール(フレームワーク)を試してみる
  • 前回に続き、template resource を使った recipe を追加して cookbook をテストしてみる
  • 作った cookbook や example は github にアップする

準備

前回使った 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

f:id:inokara:20130504022241p:plain

ハマったところ

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 は下記のように書けとあった...

f:id:inokara:20130504022943p:plain

下記のように書きなおして 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 で扱いは異なる
    • レシピの中で異なるのだから、当然のことなのかもしれないが...
  • ドキュメントは何度読んでも損は無い