RSpecのマッチャを使いこなせ

スポンサーリンク

はじめに

RSpecのマッチャがめちゃくちゃ数が多くて覚えきれない・・・
という人向けにマッチャ一覧をまとめました!

環境

RSpec 3.9
Ruby 2.5.1

公式サイト

RSpec公式ドキュメント

参考サイト

使えるRSpec入門・その2「使用頻度の高いマッチャを使いこなす」

マッチャとは?

マッチャは「期待するデータと実際のデータを比較して、一致したor一致しなかったという結果を返すメソッド」です。

マッチャの語源はmatcherで、matchという英語から連想するとわかりやすいかもしれません!

具体的な例

expect( 1 + 2 ).to eq 3
expect( 1 + 3 ).not_to eq 2

このeqがマッチャです。
expectの引数とeqの引数を比較しています。

toとnot_toについて

これは見たまんまですが
これでいい?(to)
これじゃダメだよね?(not_to)
ということです。

結論

よく使うマッチャだけ覚えておけばOK!
ただ、使うシーンがなかなかわからないということだと思うので、具体的な例ごとにまとめてみました。
※全然使わないマッチャもあるので一部端折っています。

マッチャ使い方一覧

RSpec公式ドキュメントのこのページにマッチャ一覧の記載があります。
が僕なりに日本語でまとめてみました。

オブジェクトが全く同じかどうか

be

expect("検証したいもの").to be("中に入っていて欲しいもの")

具体的なイメージ

オブジェクトにはそれぞれobject_idが存在しているのですが、完全一致するかどうかを確かめたい時に使います。
ぶっちゃけあまり使いません!

オブジェクトが一致しているか

eq

expect("検証したいもの").to eq("中に入っていて欲しいもの")

値の比較

be, be_between, match, be_within, start_with, end_with

expect("検証したいもの").to be >  "期待しているもの"
# 期待するものより大きい
expect("検証したいもの").to be >= "期待しているもの"
# 期待するもの以上
expect("検証したいもの").to be <= "期待しているもの"
# 期待するもの以下
expect("検証したいもの").to be <  "期待しているもの"
# 期待するものより小さい
expect("検証したいもの").to be_between(minimum, maximum).inclusive
# 指定した範囲の中にある
expect("検証したいもの").to be_between(minimum, maximum).exclusive
# 指定した範囲の外にある
expect("検証したいもの").to match(/expression/)
# 正規表現での比較が一致している
expect("検証したいもの").to be_within("数字").of("期待しているもの")
#  "検証したいもの" == "期待しているもの" +/- "数字"
expect("検証したいもの").to start_with "期待しているもの"
# 指定のオブジェクトから始まっているか
expect("検証したいもの").to end_with "期待しているもの"
# 指定のオブジェクトで終了しているか

インスタンスの中を確認する

be_instance_of, be_kind_of, respond_to

expect("検証したいもの").to be_, instance_of("期待しているもの")
# "検証したいもの"が"期待しているもの"の直接のインスタンスかどうか
expect("検証したいもの").to be_kind_of("期待しているもの")
# "検証したいもの"が"期待しているもの"のクラスを継承しているか、またはモジュールを継承してきているか。
expect("検証したいもの").to respond_to("期待しているもの")
# "検証したいもの"が"期待しているもの"の名前のメソッドを持っているか

真偽値を確認

be_truthy, be true ,be_falsey ,be false ,be_nil, exist, exist(*args)

expect("検証したいもの").to be_truthy
expect("検証したいもの").to be true
expect("検証したいもの").to be_falsey
expect("検証したいもの").to be false
expect("検証したいもの").to be_nil
expect("検証したいもの").to exist
expect("検証したいもの").to exist(*args)

エラーがあるか

raise_error

expect { ... }.to raise_error
expect { ... }.to raise_error(ErrorClass)
expect { ... }.to raise_error("message")
expect { ... }.to raise_error(ErrorClass, "message")

値の確認

include, contain_exactly, match_array

expect([1, 2, 3]).to     include(1)
expect([1, 2, 3]).to     include(1, 2)
expect(:a => 'b').to     include(:a => 'b')
expect("this string").to include("is str")
expect([1, 2, 3]).to     contain_exactly(2, 1, 3)
expect([1, 2, 3]).to     match_array([3, 2, 1])

変更点があるか

change

expect { object.action }.to change(object, :value).from(old).to(new)
expect { object.action }.to change(object, :value).by(delta)
expect { object.action }.to change(object, :value).by_at_least(minimum_delta)
expect { object.action }.to change(object, :value).by_at_most(maximum_delta)

終わりに

たくさんのマッチャがありますが、全部覚える必要ないと思っています。
徐々に使えるマッチャを増やしていきましょう!

タイトルとURLをコピーしました