tkymtk's blog

Ruby on Rails及びその周辺について調べたこと。Do whatever you want to do at your own pace.

RSpec: マッチャー定義でchainを使う

定義

RSpec::Matchers.define :be_bigger_than do |first|
  match do |actual|
    (actual > first) && (actual < @second)
  end

  chain :but_smaller_than do |second|
    @second = second
  end
end

実行

RSpec.describe 5 do
  it { is_expected.to be_bigger_than(4).but_smaller_than(6) }
end

chainに定義したものから実行される。

いつ使うか

上の例を、煩雑に書くとこんな感じ

定義

RSpec::Matchers.define :be_bigger_than do |first|
  match do |actual|
    (actual > first) 
  end
end

RSpec::Matchers.define :be_smaller_than do |second|
  match do |actual|
    (actual < second)
  end
end

実行

RSpec.describe 5 do
  it { is_expected.to be_bigger_than(4)
  it { is_expected.to be_smaller_than(6)} 
end

つまり、同じsubjectに対し、2つのテストを実行するときは、 chainを利用して記述を簡略化することができることがあるんじゃないかな。

リンク

間違いがあれば、ご指摘下さると幸いです。