gpt4 book ai didi

python - 如何使用 assertRaises() 对 python 类的 __init__() 方法进行单元测试?

转载 作者:IT老高 更新时间:2023-10-28 20:22:02 25 4
gpt4 key购买 nike

我有一个类:

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

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

最佳答案

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

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

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

这是您尝试编写的代码的完整版本,我正在复制所有内容,因为您的原始示例中有一个奇怪的关键字参数,您似乎将其与作业混为一谈,而我正在使用 ' 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函数并稍作修改。

关于python - 如何使用 assertRaises() 对 python 类的 __init__() 方法进行单元测试?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/88325/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com