使用unittest.assertRaises
時遇到了一個奇怪的問題。當執行下面的代碼時,我得到以下輸出:assertRaises剛剛捕捉到基本異常
E
======================================================================
ERROR: testAssertRaises (__main__.Test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "C:\home\python_test\src\derived.py", line 29, in testAssertRaises
self.assertRaises(MyError, self.raiser.raiseMyError)
File "C:\Programme\Python26\lib\unittest.py", line 336, in failUnlessRaises
callableObj(*args, **kwargs)
File "C:\home\python_test\src\derived.py", line 15, in raiseMyError
raise MyError("My message")
MyError: 'My message'
----------------------------------------------------------------------
Ran 1 test in 0.000s
FAILED (errors=1)
正確的異常被引發,但測試失敗!如果我趕上BaseError
測試成功。
不知何故,這似乎是單元測試的範圍問題,無法看到MyError
異常類。有人可以解釋嗎?有一些解決方法嗎?
我正在測試下面的Python代碼,它是通過類名動態構建對象的實現。
這是基本模塊 「bases.py」:
class BaseClass(object):
@staticmethod
def get(className):
module = __import__("derived", globals(), locals(), [className])
theClass = getattr(module, className)
return theClass()
class BaseError(Exception):
def __init__(self, msg):
self.msg = msg
def __str__(self):
return repr(self.msg)
這是測試模塊, 「derived.py」:
import unittest
from bases import BaseError
from bases import BaseClass
class MyErrorRaiser(BaseClass):
def raiseMyError(self):
raise MyError("My message")
class MyError(BaseError):
'''
'''
class Test(unittest.TestCase):
def setUp(self):
self.raiser = BaseClass.get("MyErrorRaiser")
def testAssertRaises(self):
self.assertRaises(MyError, self.raiser.raiseMyError)
if __name__ == "__main__":
unittest.main()
啊,這是有道理的。任何想法如何更好地實現呢?我已經注意到,如果將異常移動到單獨的模塊,它就可以工作。 – desolat 2010-01-06 13:25:34
移動異常將解決此問題,但您仍然有相同模塊的兩個不同副本,並且稍後可能會出現其他問題。您需要以某種方式確保主模塊不會被其他模塊導入。我不知道爲什麼你需要'BaseClass.get'方法,所以我不能告訴你如何改進它,除了避免在單元測試中調用它。 – interjay 2010-01-06 13:46:06