特殊な例外クラスを設計したい場合

http://rucila.s43.xrea.com/memo/?date=20070206#p02

  • ある箇所で、ある例外があがること

  • その例外の状態が xxx であること

はそれぞれ別の検査項目だったりするかもしれないので、そういうときはcontextを分けるのが良いんじゃないかなぁ、と思いました。
どこかで結合させるにしても、例外クラスの振舞(スタックトレースの差替え含む)を考える場合と例外をあげる場合はまぁ一手で書けなくてもゆるそうか、と。
というわけでこんな書き方はいかがでしょ。

context "do_something " do
  specify "should reraise Myrror" do
    lambda{ do_something() }.should_raise(MyError)
  end
end

context "MyError" do
  setup do 
    err = mock "Error"
    msg = "error msg"
    @bt = ["a", "b"]
    err.stub!(:message).and_return(msg)
    err.stub!(:backtrace).and_return(bt)
    begin
      reraise(err)
    rescue 
      @my_error = $!
    end
  end

  specify "backtrace should == bt" do
    @my_error.backtrace.should == bt
  end
end

setup を厚くして specify は一行かそこらに納めるのが最近の好みです。