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 } を呼び出すメソッドがほしいですねえ。