RSpec の is_expected で raise_error を検知したかった

RSpec では subjectis_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 } という風にブロックで呼び出す必要が有ります。

回避方法

このような場合、subjectproc を返すようにすると上手く動作します。

context "test" do
    subject { -> { raise RuntimeError } }
    it { is_expected.to raise_error(RuntimeError) }
end

素直に expect { subject } を呼び出すメソッドがほしいですねえ。

参照

github.com