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