RSpec の is_expected で raise_error を検知したかった
RSpec では subject
と is_expected
を利用して次のようにテストを書くことが出来ます。
context "test" do subject { 42 } # is_expected の内部で subject が呼び出される it { is_expected.to eq(42) } end
raise_error を使いたかった
次のように raise
が発生する場合は is_expected
を利用することが出来ません。
context "test" do subject { raise RuntimeError } it { is_expected.to raise_error(RuntimeError) } end
これは is_expected
が内部で expect(subject)
という風に呼び出されるためです。
raise_error
をテストするためには expect { subject }
という風にブロックで呼び出す必要が有ります。
回避方法
このような場合、subject
で proc
を返すようにすると上手く動作します。
context "test" do subject { -> { raise RuntimeError } } it { is_expected.to raise_error(RuntimeError) } end
素直に expect { subject }
を呼び出すメソッドがほしいですねえ。