检查模拟是否相等

2024-09-20 03:57:01 发布

您现在位置:Python中文网/ 问答频道 /正文

有没有一种简单的方法可以根据两个unittest.mock.Mock实例的非特殊属性检查它们是否相等Mock不提供__eq__实现(而且MagicMockAFAIK也不提供),因此Mock(a=1) == Mock(a=1)的计算结果为False

我正在寻找一种同样适用于嵌套mock的解决方案,例如Mock(a=Mock(x=1), b=2)

我曾尝试使用dir列出mock的属性,但其中也包含一些特殊属性,如method_calls,我希望忽略这些属性。我也不喜欢硬编码和删除特殊属性

准确地说,我希望下面返回True

m1 = Mock(a=1, b=Mock(c=2))
m2 = Mock(a=1, b=Mock(c=2))
m1.some_method()
compare_mocks(m1, m2)

鉴于以下内容应返回False(不同的.b.c值):

compare_mocks(Mock(a=1, b=Mock(c=2)), Mock(a=1, b=Mock(c=3))

Tags: 实例方法false属性unittestmockmethodcompare
1条回答
网友
1楼 · 发布于 2024-09-20 03:57:01

除了暴力检查属性,我想不出任何东西

def mock_attrs_eq(m1, m2):
    new = type(m1)()
    m1_dir = sorted(set(dir(m1)) - set(dir(new)))
    m2_dir = sorted(set(dir(m2)) - set(dir(new)))
    if len(m1_dir) != len(m2_dir):
        return False
    for name1, name2 in zip(m1_dir, m2_dir):
        if name1 != name2:
            return False
        attr1 = getattr(m1, name1)
        attr2 = getattr(m2, name2)
        typenames = {attr1.__class__.__name__, attr2.__class__.__name__}
        if typenames == {new.__class__.__name__}:
            if not mock_attrs_eq(attr1, attr2):
                return False
        else:
            if attr1 != attr2:
                return False
    return True

这应该满足您对简单用例的要求。 在一个模拟实际引用另一个的情况下,这可能会进入无限递归

相关问题 更多 >