如何使用Python中的unittest模块将两个对象列表与断言进行比较?

Mar*_*Aja 4 python unit-testing

我有一个返回某个类的对象列表的方法(让我们用属性 a、bc 和方法 my_method 调用该类 A。所以我得到类似的东西:

my_method() -> [A(a1, b1, c1), A(a2, b2, c2), A(a3, b3, c3)]
Run Code Online (Sandbox Code Playgroud)

我想对这个方法进行单元测试,但我真的不知道我应该使用哪种断言方法来这样做。

我想写一些类似的东西:

self.assertListEqual(my_method(), [A(a1, b1, c1), A(a2, b2, c2), A(a3, b3, c3)])
Run Code Online (Sandbox Code Playgroud)

请注意,此行不起作用(我测试失败),因为我认为它不适用于对象列表(仅适用于数字列表等基本类型列表)。我得到一个:

First differing element 0
Run Code Online (Sandbox Code Playgroud)

以及显示第一个对象具有不同地址的细节(这当然是正常的),但这不是我想要比较的。我只想比较属性是否相等(仅供参考,属性 a、b 和 c 是“基本”类型,即字符串或数字)

元素的顺序无关紧要。因此,仅当两个列表都包含有效不同的元素(并且顺序不同)时,我才想要失败。我正在使用 Python3。

谢谢,

Jak*_* P. 5

我不确定如何可扩展地实现eq但你可以简单地试试这个:

import unittest

class A:
    def __init__(self, a, b, c):
        self.a = a
        self.b = b
        self.c = c

    def __eq__(self, other):
        return self.a == other.a and self.b == other.b and self.c == other.c


a1, a2, a3 = ('a1', 'a2', 'a3')
b1, b2, b3 = ('b1', 'b2', 'b3')
c1, c2, c3 = ('c1', 'c2', 'c3')

def my_method():
    return [
        A(a1, b1, c1),
        A(a2, b2, c2),
        A(a3, b3, c3)
    ]

class BasicsTestCase(unittest.TestCase):
    def test_list_of_objects(self):
        self.assertListEqual(my_method(), [A(a1, b1, c1), A(a2, b2, c2),  A(a3, b3, c3)])
Run Code Online (Sandbox Code Playgroud)

但是,如果 my_method() 中存在实际错误,我不确定解析结果是否容易,所以这只是一个快速而肮脏的解决方案......