我有一个方法返回某个类的对象列表(让我们用属性a,b c和方法my_method调用该类A.所以我得到类似的东西:
my_method() -> [A(a1, b1, c1), A(a2, b2, c2), A(a3, b3, c3)]
我想对这个方法进行单元测试,但我真的不知道应该使用哪种断言方法。
我想写一些像:
self.assertListEqual(my_method(), [A(a1, b1, c1), A(a2, b2, c2), A(a3, b3, c3)])
注意,这行不起作用(我的测试失败),因为我认为它不适用于对象列表(只有基本类型列表,如数字列表)。我得到了:
First differing element 0
和一个细节显示那些第一个对象有不同的地址(当然是正常的),但它不是我想要比较的。我只想比较属性是否相等(FYI,属性a,b和c是“基本”类型,即字符串或数字)
元素的顺序无关紧要。因此,只有当两个列表包含有效的不同元素(并且以不同的顺序不同)时,我才想要失败。我正在使用Python3。
谢谢,
答案 0 :(得分:2)
我不确定如何可扩展地实施 eq ,但你可以试试这个:
public
但是,如果my_method()中存在实际错误,我不确定是否很容易解析结果,因此这只是一个快速而肮脏的解决方案......
答案 1 :(得分:0)
actual = my_method()
expected = [A(a1, b1, c1), A(a2, b2, c2), A(a3, b3, c3)]
self.assertListEqual(list(map(vars, expected)), list(map(vars, actual)))
您可以将var
应用于列表的元素。
附带说明一下,assert()
参数的正确顺序是(expected, actual)
,而不是(actual, expected)
。该顺序很重要,因为如果测试失败,则如果顺序错误,则错误消息将是错误的。