serverspecでデフォルトで定義されてるマッチャbe_fileとか以外に自分でカスタムマッチャを定義する方法のメモ。
例として、指定のパスのファイルがYAML形式としてパース出来るかどうかをテストするbe_yamlというマッチャを定義してみます。ただのRSpecの範疇な気がしますが、応用例がserverspecで便利っぽいだけです。
何がうれしいかというと、ChefでYAMLファイルを動的に生成していると、誤って変なデータ埋め込んでパースできなくなるというあるあるをserverspecのテストで検出できたりして幸せになれる。
まずcustom_matcher.rb
みたいなファイルを作って
require 'yaml'
# YAMLファイルのフォーマットチェック用のカスタムマッチャ
RSpec::Matchers.define :be_yaml do
match do |file|
begin
# YAML.loadでパースして例外が発生しないかテストする
YAML.load(file)
true
rescue
false
end
end
end
spec_helper.rb
から読み込みます。
require 'serverspec'
require_relative './custom_matcher'
...(略)
使い方はこんな感じです。
require 'spec_helper'
describe "hoge_server spec" do
describe file("/hoge/config/database.yml") do
its(:content) { should be_yaml }
end
end
やり方は簡単で色々応用が効くので夢がひろがリングですねー。