RSpecのexpect() と expect{ } がややこしい

expect() と expect{ }の使い分けを理解する

最近RSpecのテストを書くようになったのですが、 expect()expect{ } の違いがよく分かっておらず、「どっちかでテストを書いてみて、 テストが落ちたら、もう片方に修正する。」 なんて、非常に無駄な作業が発生していたので、調べてみました!

もうお分かりかと思いますが、RSpec初心者向けの記事です笑

結論

結論から言うと、expect()expect{ }2つを使い分けるコツは expectはmatcherに中身をそのまま渡すので、() で書けるか、{}でかけるかはmatcherがProcを評価できるか出来ないか次第 と言うことでした!

なので、この2つの理解が大事と言うことですね。 - matcher - Proc

どちらも、ご存知とは思いますが、一応簡単に説明入れると

matcher

matcherとは下でいう to の部分のことです。 expect() で呼んでいる変数とeqの後に続く期待する答えの橋渡し的な存在です。 to以外では、not_to be raise_errorなどがあります。

hoge = 3
expect(hoge).to eq 3

Proc

Procとはブロック(何らかの)をオブジェクト化するためのクラスです。 Procオブジェクトはcallメソッドによって実行されます。

ex

add_number = Proc.new { |num_1, num_2|
  puts num_1 + num_2
}
add_number.call(1, 2) #=> 3

Procについては下記の記事がわかりやすいと思います Ruby Procについて学ぶ - Qiita

下記の記事を参考にしたので、理由は下記の記事を参照してください。 should を捨て expect を使うようになった、たった一つの理由 - MUGENUP技術ブログ