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