cookbookを共通化したりlibrariesを使ってコンパクト化をしていますが、その関係でrecipe内で一定のエラー処理を書いてしまいたい事が増えました。
エラーを出力するのであれば、当然ながらそれをテストしたいということで、chefspecでの例外のテスト方法をまとめます。
chefspec_raise_error
describe 'chefspec sample' do
let (:chef_run) do
chef_run = ChefSpec::ChefRunner.new.converge 'expect::error'
end
it 'raise error' do
stdout_org = $stdout.dup
$stdout.reopen("/dev/null", "a")
expect{ chef_run }.to raise_error
$stdout.reopen stdout_org
end
end
ポイントはexpect{ chef_run }
をしてraise_error
で受けること。
raise_error
マッチャはProcインスタンスに対して有効なので、()ではなく{}にしなければなりません。
あとは実行したときにChef::Runner
がいろいろとメッセージを吐いてしまうので、それを捨てるために標準出力を捨てています。