在 pytest 中断言时忽略字典中的元素

问题描述 投票:0回答:4

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

例如:

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

谢谢 杰伊

python pytest
4个回答
24
投票

系统库

ANY
中有一个很棒的符号叫
unittest.mock
,可以用作通配符。试试这个

from unittest.mock import ANY
actual = {'userName': 'bob', 'lastModified': '2012-01-01'}
expected = {'userName': 'bob', 'lastModified': ANY}
assert actual == expected

22
投票

我通过创建等于一切的对象解决了这个问题:

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.ANY
而不是创建自己的类。


1
投票

在断言之前,制作

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")

0
投票
def test_compare_dicts():
    dict1 = {'userName':'bob','lastModified':'2012-01-01'}
    dict2 = {'userName':'bob','lastModified':'2013-01-01'}

    excluded_fields = ['lastModified']

    assert {k: v for k, v in dict1.items() if k not in excluded_fields} == {k: v for k, v in dict2.items() if k not in excluded_fields}
© www.soinside.com 2019 - 2024. All rights reserved.