Posted at

serverspecでカスタムマッチャを定義してYAML形式としてパース出来るかどうかをテストするbe_yamlを作ってみる

More than 3 years have passed since last update.

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

やり方は簡単で色々応用が効くので夢がひろがリングですねー。