在pytest中断言时忽略dict中的元素

ina*_*aze 4 python pytest

我想知道在pytest中执行断言时是否有办法忽略dict中的元素.我们有一个断言,它将比较包含last_modified_date的列表.日期将始终更新,因此无法确定日期是否等于最初输入的日期.

例如:

{'userName':'bob','lastModified':'2012-01-01'}
Run Code Online (Sandbox Code Playgroud)

谢谢Jay

vid*_*ige 21

ANY系统库中有一个优秀的符号unittest.mock可以用作通配符。尝试这个

from unittest.mock import ANY
actual = {'userName':'bob', 'lastModified':'2012-01-01'}
expected = {'userName':'bob', 'lastModified': ANY}
assert actual == expected
Run Code Online (Sandbox Code Playgroud)


小智 7

我通过创建等于所有东西的对象解决了这个问题:

class EverythingEquals:
    def __eq__(self, other):
        return True

everything_equals = EverythingEquals()

def test_compare_dicts():
    assert {'userName':'bob','lastModified':'2012-01-01'} == {'userName': 'bob', 'lastModified': everything_equals}
Run Code Online (Sandbox Code Playgroud)

这样它将被比较为相同,你也会检查'lastModified'你的dict.


kin*_*all 1

在断言之前,创建 的副本并从副本中dict删除密钥,或将其设置为静态值。lastModified由于deldict.update()等不返回dict,您可以为此编写一个辅助函数:

def ignore_keys(d, *args):
    d = dict(d)
    for k in args:
        del d[k]
    return d

assert ignore_keys(myDict, "lastModified") == {"userName": "bob")
Run Code Online (Sandbox Code Playgroud)