首页 > 解决方案 > 列表项的assertEqual自定义比较

问题描述

在 Python 中,我想为特定类执行自定义比较。我必须测试的函数返回一个列表,其中包含由我无法控制的库创建的对象。错误(使我的测试失败)是因为这个特定的对象比较。

第一个不同的元素 0:

return 实际上是正确的,但是__eq__库对象的功能 return False

class NotControlledClass:
    def __eq__(self, other):
        # Always return false as objects are created into the tested function and 
        # the other one into the testing function
        return False

def myCustomEqual(a, b, msg):
    # This is never call
    return a.name == b.name

def test(self):
    self.addTypeEqualityFunc(NotControlledClass, myCustomEqual)

    obj1 = NotControlledClass()
    obj2 = NotControlledClass()

    self.assertEquals([obj1], [obj2])

我试图遍历我的结果并逐个比较元素,但问题是该函数可以返回递归结果,例如将列表返回到列表中。
有谁知道如何使这个测试通过?

标签: pythonpython-unittest

解决方案


但问题是该函数可能会返回递归结果,例如 list into list

所以让我们使用递归。我可以建议以下代码(未经测试):

def assertListNotControlledClassEqual(self, list1, list2, msg=None):
    self.assertEqual(len(list1), len(list2), msg)
    for obj1, obj2 in zip(list1, list2):
        self.assertEqual(type(obj1), type(obj2), msg)
        if isinstance(obj1, list):
            self.assertListNotControlledClassEqual(obj1, obj2, msg)
        else:
            self.assertEqual(obj1, obj2, msg)

...

def test(self):
    self.addTypeEqualityFunc(NotControlledClass, myCustomEqual)

    obj1 = NotControlledClass()
    obj2 = NotControlledClass()

    self.assertListNotControlledClassEqual([obj1], [obj2])

这对我来说似乎是单元测试中的一个错误。我希望addTypeEqualityFunc递归到容器中,但它没有

assertEqual状态手册:

此外,如果 first 和 second 是完全相同的类型,并且 list、tuple、dict、set、frozenset 或 str 中的一个或子类使用addTypeEqualityFunc()特定于类型的相等函数注册的任何类型,将被调用以生成更有用的默认错误信息

但是,特定类型的列表方法assertListEqualaddTypeEqualityFunc()根本没有提及


推荐阅读