微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

python unittest 将断言与上下文管理器结合起来

如何解决python unittest 将断言与上下文管理器结合起来

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

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

我使用 unittest assertRaises AND assertEqual,所以我可以检查带有错误参数的函数是否引发了 TypeError 以及 TypeError 是否真的吐出“参数应该是整数类型”

StickerData

两次调用函数看起来有点傻,首先检查它是否引发异常,然后检查哪个 TypeError 异常?
经过一番研究,我知道应该可以使用上下文管理器一次性完成这两个测试,但我似乎无法入不敷出......

解决方法

您可以使用 with self.assertRaises(ExceptionType) 上下文管理器来捕获异常。根据 assertRaises manual,您可以查看 with 块之后的异常:如果您使用 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 中引入新的作用域。 with 中定义的变量与 with 语句本身的作用域相同。请参阅 https://stackoverflow.com/a/45100308/3216427 到这一点,对于实际创建范围的内容,https://stackoverflow.com/a/52992404/3216427

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。