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

Dip*_*iya 0 python python-3.x python-unittest

请检查以下代码:

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()
Run Code Online (Sandbox Code Playgroud)

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

AssertionError:“^我的消息$”与“'我的消息'”不匹配


我缺少什么?


正如评论中提到的,这些是我的问题:

  • 为什么这个测试会失败?
  • 不是'^my message$'有效的正则表达式吗?
  • 如何检查该消息是否是exactly 'my message'

dsp*_*cer 5

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

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

>>> str(KeyError('my message'))
"'my message'"
Run Code Online (Sandbox Code Playgroud)

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