9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 5 years have passed since last update.

ValidationのテストをRSpecカスタムマッチャに変えてみた

9
Last updated at Posted at 2015-09-18

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とかも作ってやると便利かもね

9
9
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
9

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?