👌

RSpecのexpect の () と {} の違い

2024/01/03に公開

RSpecのexpectについて

expectはテスト対象を検証するためのメソッドです。

expect(実行結果).to eq 期待する結果

実行結果は期待結果と同じという意味です。
eqは「等しいこと」を意味する意味で***matcher(マッチャー)***のことです。

()と{}の使い方の違い

RSpecのexpectで()(カッコ){}(中括弧、ブレース)の違いは、
ブロック内のコードの評価方法に関連しています。

()(カッコ)を使用する場合:

()内を先に処理して、それをexpectに渡します

expect(A).to matcher

expectの引数として与えられたAが評価され、その評価結果がmatcherと照合されます。
()内のコードが最初に評価され、その結果がマッチャーに渡されます

expect(10 + 5).to eq(15)

みたいな感じです。

{}を使用する場合:

expect { B }.to matcher

expectの中のBが評価されますが、expect内で適切なタイミングで実行されます。

expect { raise StandardError.new }.to raise_error(StandardError)

この形式は、ブロック内のコードがエラーを発生させるか、ある種の副作用を持つ場合に便利みたいです。

結論

()を使用すると、引数内の式がすぐに評価され{}を使用すると、ブロック内のコードはexpectブロック内で適切なタイミングで実行されます
選択肢はテストケースに合わせて使い分けていく必要があるみたいです。

資料

https://teratail.com/questions/121303

https://libitte.hatenablog.jp/entry/20141129/1417251425#:~:text=はそれぞれ値を引数,するかが異なります。

https://www.sejuku.net/blog/47847

ChatGptにも質問してみました。

補足

2023年9月27日に投稿した記事を都合でこちらに投稿しました。

Discussion