Rails4 rspecによる例外のテスト
関数のテストをするとき、正常に例外が発生するかテストしたかった。
仮に下記のような関数を作る
def get_name(number) case number when 1 "名前1" when 2 "名前2" else raise ArgumentError, "引数が範囲外です。number= #{number}" end end
specのテストには下記のように記載する。
describe "get_name" do context "正常系" do it "1のとき、名前1を返す" do input = 1 result = "名前1" expect(get_name(input)).to eq(result) end it "2のとき、名前2を返す" do input = 2 result = "名前2" expect(get_name(input)).to eq(result) end end context "異常系" do it "引数が範囲外のとき、引数エラーの例外を投げる" do input = 3 expect{get_progress_name(input)}.to raise_error(ArgumentError, "引数が範囲外です。number = #{input}") end end end
異常系のとき、expectの次の括弧は{}であることに注意。
期待値は例外メッセージの有無で下記のようになる。
# 例外メッセージあり raise_error(例外, "例外メッセージ") # 例外メッセージなし raise_error(例外)
参考:
RSpecによるテスト記述 - どこでも見れるメモ帳ruby - How to test that invalid arguments raise an ArgumentError exception using RSpec? - Stack Overflow