0
0

はじめに

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でのかっこの違いで、結果が大きく変わることを知りました。
処理の流れを頭に入れて、自分がテストしたい項目の場合、どちらが適切か都度考えて、実装しましょう。

最後までご覧いただき、ありがとうございました。

参考文献

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0