RSpec

【RSpec】eq/match/match_array/contain_exactlyマッチャの違いとその使い分けについて

RSpec

 

今回はRSpecで配列比較をテストする4つのマッチャ「eq」「match」「match_array」「contain_exactly」についてそれぞれ解説したいと思います。それぞれの違いと意味を理解し、適切に使い分けられるようにしておきましょう。

eqマッチャ

eqマッチャは配列の要素と要素の順番を比較します。

以下のテストの場合は、配列の要素と要素の順番が一致しているためパスします。

expect([banana, apple, lemon]).to eq [banana, apple, lemon]
=> true

 

一方で以下のようなテストの場合は、配列の要素は一致していますが順番が異なるためテストをパスしません。

expect([banana, apple, lemon]).to eq [apple, lemon, banana]
=> false

 

このように、eqマッチャは配列の要素とその順番が一致しているかどうかを確かめる際に用いられるマッチャになります。

matchマッチャ

matchマッチャは配列の要素と要素の順番を比較します。

お気づきになられた方もいるかもしれませんが、matchマッチャの使い方はeqマッチャと同じになります。

同様に例を見ていきましょう。

以下のテストの場合は、配列の要素と要素の順番が一致しているためパスします。

expect([banana, apple, lemon]).to match [banana, apple, lemon]
=> true

 

一方で以下のようなテストの場合は、配列の要素は一致していますが順番が異なるためテストをパスしません。

expect([banana, apple, lemon]).to match [apple, lemon, banana]
=> false

 

このようにmatchマッチャもeqマッチャと同様に、配列の要素とその順番が一致しているかどうかを確かめる際に用いられるマッチャになります。

match_arrayマッチャ

match_arrayマッチャは配列の要素を比較するマッチャです。

先ほどのeqマッチャとmatchマッチャは要素の順番まで比較していましたが、match_arrayマッチャは順番は比較しません。

expect([banana, apple, lemon]).to match_array([banana, apple, lemon])
=> true

expect([banana, apple, lemon]).to match_array([apple, lemon, banana])
=> true

expect([banana, apple, lemon]).to match_array([apple, lemon])
=> false

 

このように、match_arrayマッチャは配列の要素のみを検証するマッチャになります。

contain_exactlyマッチャ

contain_exactlyマッチャは配列の要素を比較するマッチャです。

こちらも気づいた方がいるかもしれませんが、match_arrayマッチャとcontain_exactlyマッチャの使い方は同じになります。

しかし記述方法には1点注意が必要です。

contain_exactlyマッチャでは比較対象に配列(= [])を書いてはいけません。

例を見てみましょう。

expect([banana, apple, lemon]).to contain_exactly(banana, apple, lemon)
=> true

expect([banana, apple, lemon]).to contain_exactly(apple, lemon, banana)
=> true

expect([banana, apple, lemon]).to contain_exactly(apple, lemon)
=> false

 

このようにcontain_exactlyマッチャは配列の要素を比較するマッチャであり、比較対象には配列(= [])を書いてはいけません。

結局どちらを使うべきか

ここまででeqマッチャとmatchマッチャ、match_arrayマッチャとcontain_exactlyマッチャの意味は同じであることが分かりました。

では結局、どちらのマッチャを使えばよいのでしょうか?

僕の意見としては、どちらでも構わないと思います。

コードの見やすさや分かりやすさは人それぞれですので、使い分けにそこまで気にする必要はないと個人的には思います。

まとめ

配列の要素と要素の順番を比較eq, match
配列の要素を比較match_array, contain_exactly
contain_exactlyマッチャの書き方には注意が必要。

参考

RSpecで配列をテストするマッチャの使い分け

 

 

今回はRSpecで配列比較をテストする4つのマッチャ「eq」「match」「match_array」「contain_exactly」についてそれぞれ解説しました。同じ意味を持ったマッチャですが、きちんと理解した上で使いこなせるようにしておきましょう。