我有一堂课:
1 2 3 4
| class MyClass:
def __init__(self, foo):
if foo != 1:
raise Error("foo is not equal to 1!") |
以及一个单元测试,它应该确保传递给构造函数的参数不正确,从而引发一个错误:
1 2 3
| def testInsufficientArgs(self):
foo = 0
self.assertRaises((Error), myClass = MyClass(Error, foo)) |
但我得到…
1
| NameError: global name 'Error' is not defined |
为什么?我应该在哪里定义这个错误对象?我认为它是作为默认的异常类型内置的,不是吗?
此示例中的"错误"可以是任何异常对象。我想您可能读过一个代码示例,它将其用作元语法占位符,表示"适当的异常类"。
所有异常的基类称为"异常",其大多数子类都是所涉及错误类型的描述性名称,如"oserror"、"valueerror"、"nameerror"、"type error"。
在这种情况下,适当的错误是"value error"(foo的值错误,因此是value error)。我建议将脚本中的"error"替换为"valueerror"。
这里是您试图编写的代码的完整版本,我复制了所有内容,因为您在原始示例中有一个奇怪的关键字参数,您似乎将其与赋值混淆,而我使用的是"failuntil"函数名,因为这是函数的非别名名称:
1 2 3 4 5 6 7 8 9 10 11 12 13
| 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() |
输出是:
1 2 3 4 5
| .
----------------------------------------------------------------------
Ran 1 test in 0.007s
OK |
单元测试库"UnitTest"中存在其他单元测试框架修复的缺陷。您将注意到,无法从调用上下文访问异常对象。如果要修复此问题,则必须在UnitTest的子类中重新定义该方法:
这是一个正在使用的示例:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| 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复制了failUnlessRaises函数unittest.py,并对其进行了轻微修改。
这个怎么样?
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18
| 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() |
我认为你在考虑例外。将描述中的"错误"一词替换为"例外",您应该可以继续:—)