regex 使用正则表达式的Assertdict

wbgh16ku  于 2023-05-19  发布在  其他
关注(0)|答案(2)|浏览(93)

可以用正则表达式Assertdict吗?
例如:dict

{
    "mimetype": "application/json",
    "status_code": 200,
    "data": {
      "id": 1,
      "username": "foo",
      "access_token": "5151818748748"
  }
}

使用:regex in key access_token

{
    "mimetype": "application/json",
    "status_code": 200,
    "data": {
      "id": 1,
      "username": "foo",
      "access_token": "(.+)"
  }
}
oogrdqng

oogrdqng1#

假设我理解正确:

import re

def assert_dict(template, thing):
    if len(template) != len(thing):
        raise AssertionError("Assertion failed")
    for key in template:
        if isinstance(template[key], dict):
            assert_dict(template[key], thing[key])
        else:
            if template[key] == thing[key]:
                continue
            elif re.fullmatch(template[key], thing[key]):
                continue
            else:
                raise AssertionError("Assertion failed")

这将检查它们是否具有相同的键值对,如果是,则首先测试它们是否相同,如果不是,则第二个是否与第一个匹配。
只要字典里没有什么花哨的东西,这就行得通。列表可以工作,但列表中的dicts不行,尽管实现它也是相当琐碎的。

i7uq4tfw

i7uq4tfw2#

我也有类似的问题:

expected = {'test_res': 'Correct', ..lots more.., 'query_date': '2023-05-10T10:15:48'}
actual =  {'test_res': 'Correct', ..lots more.., 'query_date': '2023-05-12T11:51:34'}

显然,实际数据将与您最初的“预期”数据不同,所以为什么不这样做呢?

actual['query_date'] = expected['query_date']

它显然不是一个正则表达式匹配,所以您不能检查格式,但它确实满足了在测试运行时总是会不同的值(并且您不关心)。
然后您可以执行以下操作:

assertDictEquals(expected,actual)

。。。测试就会通过
如果你确实想检查排除的字段,那么你总是可以使用assertRegex单独检查这些字段。例如

assertRegexMatches(actual['query_date'], '^(?:(?:31(\/|-|\.)(?:0?[13578]|1[0')

(this不是匹配日期的实际正则表达式!)

相关问题