python unittest将Assert与上下文管理器相结合

vhipe2zx  于 2021-07-14  发布在  Java
关注(0)|答案(1)|浏览(362)

要测试函数,当第一个参数不是整数类型时引发异常:

def magicWithInteger(integerA):
    if not isinstance(integerA, int):
        raise TypeError("argument should be integer type")

我使用unittest assertraises和assertequal,这样我就可以检查参数错误的函数是否会引发typeerror,以及typeerror是否实际抛出“参数应该是整数类型”

class test(unittest.TestCase):

    def test_magicWithInteger(self):
        self.assertRaises(TypeError, MagicWithInteger, "TEST")
        try:
            MagicWithInteger("TEST")
        except TypeError as error:
            self.assertEqual(str(error), "argument should be integer type")

两次调用函数看起来有点傻,第一次是检查它是否引发异常,第二次是检查哪个typeerror异常?
经过一番研究,我知道用context manager一次性完成这两个测试是可能的,但我似乎入不敷出。。。

axr492tv

axr492tv1#

你可以使用 with self.assertRaises(ExceptionType) 上下文管理器来捕获异常。根据assertraises手册,您可以在 with block:如果您用 as <name> 语法:

with self.assertRaises(SomeException) as cm:
    do_something()

the_exception = cm.exception
self.assertEqual(the_exception.error_code, 3)

来源:docs.python.org
所以你的代码会变成:

class test(unittest.TestCase):
    def test_magicWithInteger(self):
        with self.assertRaises(TypeError) as cm:
            MagicWithInteger("TEST")
        self.assertEqual(str(cm.exception), "argument should be integer type")

ps:我不知道,但是 with 语句不会在python中引入新的作用域。内部定义的变量 withwith 声明本身。看到了吗https://stackoverflow.com/a/45100308/3216427 到这个特定的点,对于实际创建作用域的东西,https://stackoverflow.com/a/52992404/3216427.

相关问题