RSpecで例外のテストを書く時の注意点
久しぶりに例外のテストを書こうとしてハマってしまったのでメモしておきます。
結論からいうと、RSpecでmodelのvalidationなど例外発生のテストを書く時はテスト対象をlambdaで囲む必要があるということです。
[ダメなケース]
subject { @user.save! } it { should raise_error }
userモデルのsaveのvalidationでエラーが出る場合、この書き方だとエラーが発生してテストが通りません。
ActiveRecord::RecordInvalid: Validation failed: user name is invalid.
[良いケース]
subject { lambda{ @user.save! } } it { should raise_error }
lambdaで囲むと、想定通りテストが通るようになります。
lambdaで囲まなければいけないのは、shouldで評価する対象はProcである必要があるからです。Procについてはこちらの記事が参考になります。
知っていれば当たり前なのですが、ハマると無駄に時間を食って萎えるのでこういう知識は事前に吸収しておかなければなりませんね。。。