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

Python 在pytest中断言时忽略dict中的元素,python,pytest,Python,Pytest,我想知道在pytest中执行断言时是否有方法忽略dict中的元素。我们有一个断言,它将比较包含上次修改日期的列表。该日期将始终更新,因此无法确保该日期与最初输入的日期相同 例如: {'userName':'bob','lastModified':'2012-01-01'} 谢谢 Jay在断言之前,复制dict并从副本中删除lastModified键,或将其设置为静态值。由于del和dict.update()等不会返回dict,因此您可以为此编写一个帮助函数: def ignore_keys(d

我想知道在pytest中执行断言时是否有方法忽略dict中的元素。我们有一个断言,它将比较包含上次修改日期的列表。该日期将始终更新,因此无法确保该日期与最初输入的日期相同

例如:

{'userName':'bob','lastModified':'2012-01-01'}
谢谢
Jay

在断言之前,复制
dict
并从副本中删除
lastModified
键,或将其设置为静态值。由于
del
dict.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")

我通过创建与所有事物相等的对象解决了这个问题:

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}

通过这种方式,它将被比较为相同,并且您将检查您的字典中是否有
'lastModified'

系统库中有一个很好的符号,可以用作通配符。试试这个

从unittest.mock导入任何
实际值={'userName':'bob','lastModified':'2012-01-01'}
预期={'userName':'bob','lastModified':ANY}
断言实际值==预期值

你能模拟你的数据源,让你的列表包含已知的值吗?这是一个不错的解决方案,我也喜欢它检查键是否存在的方式。我用
everything_equals=type('omnieq',(),{“uuu eq_uuu”:lambda x,y:True})(
减少了它的冗长。