如何正确使用 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'"
我错过了什么?
如评论中所述,这些是我的问题:
- 为什么这个测试失败了?
'^my message$'
不是一个有效的正则表达式吗?
- 如何检查消息是否
exactly 'my message'
?
如果仔细检查 AssertionError
,您会发现 assertRaisesRegex
方法实际上是在尝试将您的模式与 'my message'
匹配,包括引号。
这是因为,from the docs,该方法是针对引发的异常的字符串表示进行模式匹配,您可以通过自己执行字符串转换来查看:
>>> str(KeyError('my message'))
"'my message'"
通过在正则表达式中修复匹配的起点和终点,您将因此导致此断言失败。前两种情况按预期工作,因为它们不受字符串表示中引号的影响。
请检查以下代码:
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'"
我错过了什么?
如评论中所述,这些是我的问题:
- 为什么这个测试失败了?
'^my message$'
不是一个有效的正则表达式吗?- 如何检查消息是否
exactly 'my message'
?
如果仔细检查 AssertionError
,您会发现 assertRaisesRegex
方法实际上是在尝试将您的模式与 'my message'
匹配,包括引号。
这是因为,from the docs,该方法是针对引发的异常的字符串表示进行模式匹配,您可以通过自己执行字符串转换来查看:
>>> str(KeyError('my message'))
"'my message'"
通过在正则表达式中修复匹配的起点和终点,您将因此导致此断言失败。前两种情况按预期工作,因为它们不受字符串表示中引号的影响。