目次
はじめに
RSpecのマッチャがめちゃくちゃ数が多くて覚えきれない・・・
という人向けにマッチャ一覧をまとめました!
環境
RSpec 3.9
Ruby 2.5.1
公式サイト
参考サイト
マッチャとは?
マッチャは「期待するデータと実際のデータを比較して、一致した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)
終わりに
たくさんのマッチャがありますが、全部覚える必要ないと思っています。
徐々に使えるマッチャを増やしていきましょう!