我有代码,当assertRaises失败时,assertRaises会抛出异常。我认为如果assertRaises失败,那么测试就会失败,我会在最后得到一个报告说测试失败了。我没想到会抛出异常。以下是我的代码。我做错了什么?我正在使用Python 2.6.2。
import unittest
class myClass:
def getName(self):
raise myExcOne, "my exception one"
#raise myExcTwo, "my exception two"
#return "a"
class myExcOne(Exception):
"exception one"
class myExcTwo(Exception):
"exception two"
class test_myClass(unittest.TestCase):
def setUp(self):
self.myClass = myClass()
def testgetNameEmpty(self):
#self.assertRaises(myExcOne,self.myClass.getName)
#self.assertRaises(myExcTwo,self.myClass.getName)
try:
self.assertRaises(myExcTwo,self.myClass.getName)
except Exception as e:
pass
if __name__ == "__main__":
#unittest.main()
suite = unittest.TestLoader().loadTestsFromTestCase(test_myClass)
unittest.TextTestRunner(verbosity=2).run(suite)
答案 0 :(得分:6)
发布的代码错误。首先,class myClass():
应为class myClass:
。 if name == "main":
也应该是:
if __name__ == "__main__":
unittest.main()
除了这些问题之外,由于getName()
引发异常myExcOne
并且您的测试需要异常myExcTwo
,因此失败了。
以下是一些有效的代码。请编辑问题中的代码,以便我们可以将其剪切并粘贴到Python会话中:
import unittest
class myExcOne(Exception): "exception one"
class myExcTwo(Exception): "exception two"
class myClass:
def getName(self):
raise myExcTwo
class test_myClass(unittest.TestCase):
def setUp(self):
self.myClass = myClass()
def testgetNameEmpty(self):
#self.assertRaises(myExcOne,self.myClass.getName)
self.assertRaises(myExcTwo,self.myClass.getName)
if __name__ == "__main__":
unittest.main()
答案 1 :(得分:6)
从一开始,()
语句中的类名后面的class
在现代Python中是完全正确的 - 根本不是错误。
问题在于assertRaises(MyException, foo)
是 ,以传播通过调用foo()
引发的异常,其类型不是{的子类{1}} - 它只捕获MyException
及其子类。由于您的代码引发了一种类型的异常,并且您的测试需要一种不同的不相关类型,因此根据MyException
模块here的文档,引发的异常将传播,并且我引用:
如果引发异常,则测试通过,如果引发另一个异常则是错误,如果没有引发异常则失败。
“是一个错误”意味着“传播另一个异常”。
当您捕获在try / except块中传播的异常时,您将使错误无效,并且unittest
无法进行任何诊断。如果您的目的是将此错误转为失败(有争议的策略......),则您的unittest
数据块应调用except
。