如何正确使用 self.assertRaisesRegex 作为上下文管理器?

How to properly use self.assertRaisesRegex as a context manager?

请检查以下代码:

import unittest


def fn():
    raise KeyError('my message')


class Test(unittest.TestCase):
    def test_passes(self):
        with self.assertRaisesRegex(KeyError, 'my message'):
            fn()

        with self.assertRaisesRegex(KeyError, 'my'):
            fn()

    def test_fails(self):
        # Why does this test fail?
        # Isn't '^my message$' a valid regex?
        # How do I check if the message is exactly 'my message'?
        with self.assertRaisesRegex(KeyError, '^my message$'):
            fn()


unittest.main()

在输出中,我得到以下测试消息 test_fails:

AssertionError: "^my message$" does not match "'my message'"


我错过了什么?


如评论中所述,这些是我的问题:

如果仔细检查 AssertionError,您会发现 assertRaisesRegex 方法实际上是在尝试将您的模式与 'my message' 匹配,包括引号。

这是因为,from the docs,该方法是针对引发的异常的字符串表示进行模式匹配,您可以通过自己执行字符串转换来查看:

>>> str(KeyError('my message'))
"'my message'"

通过在正则表达式中修复匹配的起点和终点,您将因此导致此断言失败。前两种情况按预期工作,因为它们不受字符串表示中引号的影响。