http://qiita.com/nisshiee/items/b475f475cbfce66898ec
この記事の続き。
まえがき
改めてやりたかったことをまとめると、
spec/models/team_spec.rb
RSpec.describe Team do
subject(:team) { FactoryGirl.create(:team) }
describe :name do
context 'when name is nil' do
before { team.name = nil }
expect(team).not_to be_valid
expect(team.errors[:name].size).to be >= 1
end
end
end
これがもともとの、「nameがnilだったらvalidation errorですよ」をテストするコード。
describe :nameから先、仰々しすぎて、書くのダルいから簡単にしたいよね、というのが目的。
で、マクロ化することによってこれを1行で書けるようにしたのが前回の記事。
ありがたいことに、前回の記事にコメントでアドバイスを頂いたので、続きを書く。
@jnchito ありがとうございます。
カスタムマッチャ
コメントで教えていただいたのだが、
http://qiita.com/kozy4324/items/9a6530736be7e92954bc
こちらに全部書いてありますw
もはや言うことないので、作ったカスタムマッチャ貼る。
全く同じチェック書いた。
あと、エラー時のメッセージも見やすいように軽くカスタマイズ。
spec/support/custom_matcher/validations.rb
RSpec::Matchers.define :be_invalid_on do |attr_name|
match do |model|
model.send("#{attr_name}=", @value)
model.invalid? && model.errors[attr_name].size >= 1
end
chain :with do |value|
@value = value
end
failure_message do |model|
if model.valid?
"expect #{model.class} to be invalid but it is VALID"
else
"expect #{model.class} to have errors on #{attr_name} but EMPTY"
end
end
end
これを置いとくと、以下のようにテスト書ける
spec/models/team_spec.rb
RSpec.describe Team do
subject(:team) { FactoryGirl.create(:team) }
it { is_expected.to be_invalid_on(:name).with(nil) }
end
あとがき
:be_valid_onとかも作ってやると便利かもね