くりにっき

フルスタックキュアエンジニアです

RSpecでany Matcherを作ろうとしたら既に同等のマッチャがあった件

RSpec3で実装されたall Matcherが地味に便利です。

Ruby - 今日から使える!RSpec 3で追加された8つの新機能 - Qiita

it 'すべての数値が奇数であること' do
  # RSpec 3
  expect([1, 3, 5]).to all( be_odd )
end

all Matcherがあるんだからany Matcher(コレクションのどれか1つがマッチしてたらOK)もあるんだろうと思ったらなくて、作ろうとしたら既に include Matcherで実装されていました。*1

普通にやろうとしたらこうなる

it "文字列のいずれかがキュアで始まること" do
  yes_precure_5 = %w(
    キュアドリーム 
    キュアルージュ 
    キュアレモネード 
    キュアミント 
    キュアアクア 
    ミルキィローズ
  )
  expect(yes_precure_5.any?{ |name| name =~ /^キュア/ }).to be true
end

expectの中にブロックが入るので若干見づらい

include Matcherに渡した引数はactualの各要素に適用される

it "文字列のいずれかがキュアで始まること" do
  yes_precure_5_gogo = %w(
    キュアドリーム 
    キュアルージュ 
    キュアレモネード 
    キュアミント 
    キュアアクア 
    ミルキィローズ
  )
  expect(yes_precure_5_gogo).to include /^キュア/
end

includeには別のMatcherを渡してもOK

it "文字列のいずれかがキュアで始まること" do
  yes_precure_5_gogo = %w(
    キュアドリーム 
    キュアルージュ 
    キュアレモネード 
    キュアミント 
    キュアアクア 
    ミルキィローズ
  )
  expect(yes_precure_5_gogo).to include(start_with("キュア"))
end

括弧を削っても大丈夫

it "文字列のいずれかがキュアで始まること" do
  yes_precure_5_gogo = %w(
    キュアドリーム 
    キュアルージュ 
    キュアレモネード 
    キュアミント 
    キュアアクア 
    ミルキィローズ
  )
  expect(yes_precure_5_gogo).to include start_with "キュア"
end

他のMatcherを渡せるのでCustom Matcherとの相性がよさそう!

*1:サンプルコードのどこにも載ってないので全然気づかなかった