我有一个班级:
class MyClass:
def __init__(self, foo):
if foo != 1:
raise Error("foo is not equal to 1!")
和一个单元测试,应该确保正确传递给构造函数的错误arg会引发错误:
def testInsufficientArgs(self):
foo = 0
self.assertRaises((Error), myClass = MyClass(Error, foo))
但我明白了......
NameError: global name 'Error' is not defined
为什么呢?我应该在哪里定义此Error对象?我认为它是内置的默认异常类型,不是吗?
答案 0 :(得分:25)
'错误'可以是任何异常对象。我想也许你已经读过一个代码示例,它将它用作metasyntatic占位符,意思是“适当的异常类”。
所有异常的基类都称为“异常”,其大多数子类都是所涉及错误类型的描述性名称,例如“OSError”,“ValueError”,“NameError”,“TypeError”。
在这种情况下,适当的错误是'ValueError'(foo的值错误,因此是ValueError)。我建议在脚本中用'ValueError'替换'Error'。
以下是您要编写的代码的完整版本,我正在复制所有内容,因为您在原始示例中有一个奇怪的关键字参数,您似乎与分配混淆,而我正在使用' failUnless'函数名,因为这是函数的非别名:
class MyClass:
def __init__(self, foo):
if foo != 1:
raise ValueError("foo is not equal to 1!")
import unittest
class TestFoo(unittest.TestCase):
def testInsufficientArgs(self):
foo = 0
self.failUnlessRaises(ValueError, MyClass, foo)
if __name__ == '__main__':
unittest.main()
输出结果为:
.
----------------------------------------------------------------------
Ran 1 test in 0.007s
OK
单元测试库'unittest'存在一个缺陷,其他单元测试框架已经修复。您会注意到,无法从调用上下文访问异常对象。如果你想解决这个问题,你必须在UnitTest的子类中重新定义该方法:
这是一个使用它的例子:
class TestFoo(unittest.TestCase):
def failUnlessRaises(self, excClass, callableObj, *args, **kwargs):
try:
callableObj(*args, **kwargs)
except excClass, excObj:
return excObj # Actually return the exception object
else:
if hasattr(excClass,'__name__'): excName = excClass.__name__
else: excName = str(excClass)
raise self.failureException, "%s not raised" % excName
def testInsufficientArgs(self):
foo = 0
excObj = self.failUnlessRaises(ValueError, MyClass, foo)
self.failUnlessEqual(excObj[0], 'foo is not equal to 1!')
我从python2.5中复制了unittest.py中的failUnlessRaises函数并对其进行了稍微修改。
答案 1 :(得分:5)
这个怎么样:
class MyClass:
def __init__(self, foo):
if foo != 1:
raise Exception("foo is not equal to 1!")
import unittest
class Tests(unittest.TestCase):
def testSufficientArgs(self):
foo = 1
MyClass(foo)
def testInsufficientArgs(self):
foo = 2
self.assertRaises(Exception, MyClass, foo)
if __name__ == '__main__':
unittest.main()
答案 2 :(得分:1)
我认为你在考虑Exception。将您的描述中的单词Error替换为Exception,您应该更好: - )