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