Python の unittest では assertRaises が Exception を返してくれない

ちなみに Python 付属の unittest では assertRaises の定義は以下の通り。見ればわかるけど、exception を返してくれない。

    ## assertRails は failUnlessRaises の alias
    def failUnlessRaises(self, excClass, callableObj, *args, **kwargs):
        try:
            callableObj(*args, **kwargs)
        except excClass:    ## ここを  except excClass, ex: return ex
            return          ## にしてほしかった
        else:
            if hasattr(excClass,'__name__'): excName = excClass.__name__
            else: excName = str(excClass)
            raise self.failureException, "%s not raised" % excName

そのため、発生した exception を取り出すのには、こんなふうに書かなきゃいけない。ああめんどくさい。

    def test1(self):
        L = []
        def dummy():
            try:
                open("not_exist_file")
            except Exception, ex:
                L[0] = ex
                raise
        self.assertRaises(IOError, dummy)
	ex = L[0]
	msg = "[Errno 2] No such file or directory: not_exist_file"
	self.assertEquals(msg, str(ex))

Ruby の Test::Unit みたく、assertRaises() が exception を返してくれればこんなに簡単に書けるのに。

    def test1(self):
        def dummy():
            open("not_exist_file")
        ex = self.assertRaises(IOError, dummy)
	msg = "[Errno 2] No such file or directory: not_exist_file"
	self.assertEquals(msg, str(ex))

ついでにいうと、assertRaises() はあるのに assertNotRaise() は見つからない。仕方ないので自分で定義するしかない。ああめんどくさい。

def assertNotRaise(self, callable_, *args, **kwargs):
    try:
        callable_(*args, **kwargs)
    except Exception, ex:
        self.fail("unexpected exception raised: " + repr(ex))

import unittest
unittest.assertNotRaise = assertNotRaise