当前位置:  开发笔记 > 编程语言 > 正文

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

如何解决《如何使用assertRaises()对python类的__init__()方法进行单元测试?》经验,为你挑选了2个好方法。

我有一节课:

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对象?我认为它是内置的默认异常类型,不是吗?



1> Jerub..:

此示例中的"错误"可以是任何异常对象.我想也许你已经读过一个代码示例,它将它用作metasyntatic占位符,意思是"适当的异常类".

所有异常的基类都称为"异常",其大多数子类都是所涉及错误类型的描述性名称,例如"OSError","ValueError","NameError","TypeError".

在这种情况下,适当的错误是'ValueError'(foo的值是错误的,因此是ValueError).我建议在脚本中用'ValueError'替换'Error'.

这是您要编写的代码的完整版本,我正在复制所有内容,因为您在原始示例中有一个奇怪的关键字参数,您似乎与赋值混淆,并且我正在使用'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函数并稍微修改了它.


self.failUnlessRaises现已弃用.请改用self.assertRaises.https://docs.python.org/2/library/unittest.html#deprecated-aliases

2> Terhorst..:

这个怎么样:

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()

推荐阅读
手机用户2502851955
这个屌丝很懒,什么也没留下!
DevBox开发工具箱 | 专业的在线开发工具网站    京公网安备 11010802040832号  |  京ICP备19059560号-6
Copyright © 1998 - 2020 DevBox.CN. All Rights Reserved devBox.cn 开发工具箱 版权所有