はじめに
rspecでテストを実装していて、以下の箇所で詰まりました...。
# NG
expect(subject).to raise_error(RuntimeError, 'testだよ')
# RuntimeError:
# testだよ
# OK
expect{ subject }.to raise_error(RuntimeError, 'testだよ')
{}
と()
の違いだけなのに、テストが成功するか変わりました。
挙動が違うと思い、調べた内容をアウトプットいたします。
( )
仮に、上記のコードで例を挙げます。
-
subject
を評価され、subject
の結果をexpect
メソッドに渡します - なので、
subject
を実行した内容で例外があれば、そこで処理が止まります- テストもエラーになります
流れの結果として、どんな値が返ってきたのかをテストするには、すごく向いています。
{ }
{...}
で記載したコードは、コードブロックとして評価され、「後で実行される」ことを意図しています。
処理の流れとしては、以下になります。
- ブロックの評価
-
{...}
で記載したコード
-
- マッチャの呼び出し
- 今回の例だと、
raise_error
が、ブロックが実行されたときに例外が発生するかを確認します
- 今回の例だと、
- ブロック内のコードの実行
- 例外のキャッチ
特に今回のような、subject
内で、例外が発生する処理の場合は、使用する場面が多いと思います。
まとめ
expect
でのかっこの違いで、結果が大きく変わることを知りました。
処理の流れを頭に入れて、自分がテストしたい項目の場合、どちらが適切か都度考えて、実装しましょう。
最後までご覧いただき、ありがとうございました。
参考文献