🕌

RSpec の raise_error で発生した例外オブジェクトを参照する

に公開

知らなかったので覚書。
例えば次のように特定の処理で例外が発生する場合に raise_error(発生する例外) をテストすることは今までもありました。

class Hash
  def method_missing(key)
    fetch(key)
  end
end

RSpec.describe Hash do
  describe "#method_missing" do
    let(:user) { { name: "homu", age: 14 } }

    context "キーが存在しない合" do
      # #fetch でキーが存在しないと KeyError が発生する
      it { expect { user.hoge }.to raise_error(KeyError) }
    end
  end
end

このときに『例外が持っている情報に依存して』テストを書きたい場合は『 raise_error のブロック引数』で『発生した例外』を取得してテストすることができます。

class Hash
  def method_missing(key)
    fetch(key)
  end
end

RSpec.describe Hash do
  describe "#method_missing" do
    let(:user) { { name: "homu", age: 14 } }

    context "キーが存在しない合" do
      it {
        # e で発生したオブジェクトを取得することができる
        expect { user.hoge }.to raise_error(KeyError) do |e|
          # KeyError は呼び出したメソッド名でエラーになっていること
          expect(e.key).to eq :hoge
        end
      }
    end
  end
end

こんな感じで発生した例外に依存してより細かい状態を担保することができます。

関連

GitHubで編集を提案

Discussion