🕌
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
こんな感じで発生した例外に依存してより細かい状態を担保することができます。
Discussion