Python:如果字符串与格式匹配,则断言

Python:如果字符串与格式匹配,则断言,python,django,string,unit-testing,assertions,Python,Django,String,Unit Testing,Assertions,我使用Django Rest框架APIClient对我的Django API进行了一些单元测试。 API的不同端点返回自定义错误消息,其中一些带有格式化字符串,如:“不支持几何体类型”{}” 我从客户机响应和错误消息键断言状态代码,但在某些情况下,我想确定返回了什么错误消息,以确保没有其他原因导致该错误 因此,我还想根据原始的未格式化字符串验证返回的错误消息。例如,如果我收到一条错误消息,如'Geometry type“Point”不受支持“,我想检查它是否与原始未格式化消息匹配,即'Geome

我使用Django Rest框架APIClient对我的Django API进行了一些单元测试。 API的不同端点返回自定义错误消息,其中一些带有格式化字符串,如:
“不支持几何体类型”{}”

我从客户机响应和错误消息键断言状态代码,但在某些情况下,我想确定返回了什么错误消息,以确保没有其他原因导致该错误

因此,我还想根据原始的未格式化字符串验证返回的错误消息。例如,如果我收到一条错误消息,如
'Geometry type“Point”不受支持“
,我想检查它是否与原始未格式化消息匹配,即
'Geometry type“{}”不受支持“

到目前为止,我想到的解决方案是:

  • 第一:用正则表达式模式替换原始字符串中的括号,并查看它是否与响应匹配

  • 第二:(这个想法很酷,但在某些情况下可能会失败)使用
    difflib.SequenceMatcher
    并测试相似性比率是否大于90%

更新 下面是一个例子:

有一个
dict
错误消息,每个错误从中选择相关消息,根据需要添加格式参数,并引发错误:

ERROR_MESSAGES = {
    'ERROR_1': 'Error message 1: {}. Do something about it',
    'ERROR_2': 'Something went wrong',
    'ERROR_3': 'Check you args: {}. Here is an example: {}'
}
现在,我的DRF序列化程序在处理请求时出错,并引发错误:

try:
    some_validation()
except SomeError as e:
    raise serializers.ValidationError({'field1': [ERROR_MESSAGES['ERROR_N1'], ERROR_MESSAGES['ERROR_N2']], 'field2': ['ERROR_N3']})
现在,在一个特定的测试中,我想确定是否存在某个错误消息:

class SomeTestCases(TestCase):
    def test_something(self):
        response = self.client.post(...)
        self.assertThisMessageIsInResponse(response.data, ERROR_MESSAGES['ERROR_K'])
响应。数据
可以只是一个字符串、一个命令或一系列错误;i、 e.
ValidationError
中可能出现的任何错误

指向
响应中的错误消息位置。每个测试用例的数据
没有问题。这个问题关注的是格式化字符串和未格式化字符串之间的比较


到目前为止,最简单的方法是正则表达式。我最好奇的是,是否有一个内置的断言,以及可以使用哪些其他解决方案。

似乎regex将是这里最简单的解决方案

import re
msg = 'Geometry type "point" is not supported'
assert re.match(r'^Geometry type ".+" is not supported$', msg)
您正在寻找:

class-sometestcase(TestCase):
def测试(自我):
response=self.client.post(…)
self.assertRegex(response.data,r'^your regex here$)

为什么不将原始消息中引号之间的内容替换为第一个解决方案中的
{}
,并比较两个“模板”?@Jean Françoisfare,这就是一个例子。还有其他格式不同的错误消息。我在错误键到错误键消息的
dict
中有我的消息,并且根据测试用例,我想使用我的固定错误键检查特定消息。消息本身将来可能会更改,我不想在这些更改后更新每个测试用例。@kaveh:请举例说明错误
dict
。几个问题:这个
dict
可以通过单元测试访问吗?错误键的作用是什么?@ContinuousLoad我用一个例子更新了这个问题。这是我的第一个解决方案。我想知道解决这个问题的其他方法。