31

我有一堂课:

class MyClass:
def __init__(self, foo):
    if foo != 1:
        raise Error("foo is not equal to 1!")

一个单元测试应该确保传递给构造函数的不正确的参数正确地引发了一个错误:

def testInsufficientArgs(self):
    foo = 0
    self.assertRaises((Error), myClass = MyClass(Error, foo))

但我得到...

NameError: global name 'Error' is not defined

为什么?我应该在哪里定义这个错误对象?我认为它是作为默认异常类型内置的,不是吗?

4

3 回答 3

29

此示例中的“错误”可以是任何异常对象。我想您可能已经阅读了一个代码示例,该示例将其用作元语法占位符来表示“适当的异常类”。

所有异常的基类称为'Exception',它的大多数子类都是所涉及的错误类型的描述性名称,例如'OSError'、'ValueError'、'NameError'、'TypeError'。

在这种情况下,适当的错误是“ValueError”(foo 的值是错误的,因此是 ValueError)。我建议在您的脚本中将 'Error' 替换为 'ValueError'。

这是您尝试编写的代码的完整版本,我正在复制所有内容,因为您在原始示例中有一个奇怪的关键字参数,您似乎正在与作业混为一谈,并且我正在使用“failUnless”功能name 因为这是函数的非别名名称:

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 函数,并对其稍作修改。

于 2008-09-17T22:29:33.013 回答
6

这个怎么样:

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()
于 2008-09-17T22:32:16.657 回答
1

我认为您正在考虑Exception。将描述中的错误一词替换为异常,您应该一切顺利:-)

于 2008-09-17T22:30:21.110 回答