Python单元测试-比较Python中iterables的内容<;2.7

Python单元测试-比较Python中iterables的内容<;2.7,python,Python,如何检查自定义类数组是否按所需顺序排序? 我知道在Python2.7和更高版本中有assertSequenceEqual,但我使用的是Python2.6,虽然我可以使用forloop来实现这一点。。。Python

如何检查自定义类数组是否按所需顺序排序? 我知道在Python2.7和更高版本中有assertSequenceEqual,但我使用的是Python2.6,虽然我可以使用forloop来实现这一点。。。Python<2.7中有更好的东西可以使用吗

  actual_sorted = list.sort()

  expected_sorted = [MyClass("wed", 20), 
                     MyClass("wed", 19,),
                     MyClass("thu", 18,),
                     MyClass("wed", 17,)]

  self.assertEqual(actual_sorted, expected_sorted) # Well, this doesn't work.
提前谢谢你

from operator import eq as equals
self.assertTrue(all(map(equals,actual_sorted, expected_sorted)))

这将逐个元素测试相等性。当然,如果您不想在所讨论的类上定义一个
\uuuuuueq\uuuu
,那么您可能需要定义自己的
equals
(而且您可能也不想,因为定义
\uuueq\uuuuu
可能会改变程序的行为以及单元测试)。

正如BrenBarn所说,您必须添加一个
\uuuuu eq\uuu
方法。在我看到他的答案之前,我正在写一个完整的例子:

import unittest


class MyClass(object):
    def __init__(self, day_name, day_num):
        self.day_name = day_name
        self.day_num = day_num

    def __eq__(self, other):
        return other.day_name == self.day_name and other.day_num == self.day_num


class ATestCase(unittest.TestCase):
    def test_foo(self):
        actual_sorted = [MyClass("wed", 20),
                           MyClass("wed", 19),
                           MyClass("thu", 18),
                           MyClass("wed", 17)]

        expected_sorted = [MyClass("wed", 20),
                           MyClass("wed", 19),
                           MyClass("thu", 18),
                           MyClass("wed", 17)]
        self.assertEqual(actual_sorted, expected_sorted)


if __name__ == '__main__':
    unittest.main()

如果您的
MyClass
有一个合适的
\uuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuuiq
方法,
assertEqual
应该可以处理这个问题。什么是不起作用的?
assertEquals
已经可以这样做了。您只需要为类定义一个
\uuuuuuuuuuuuuueq
方法。事实上,如果没有定义
\uuuuuuuueq
,这不会失败吗?[除非这两个序列包含相同的实例,否则我猜排序例程可能会返回哪个实例。不过,我正在考虑OP的示例,其中有两个独立的
MyClass(“wed”,20)
实例。]@DSM基元类型都定义了一个eq。@JiMun在
对象中定义了一个默认的
\uEQ
。请量化“不起作用”。@Marcin:是的,它有一个
\uuuuuuueq\uuuuuuuuuuu
,但不是一个有用的。我的班级(“星期三”,20)!=MyClass(“wed”,20),因此,除非OP定义了一个,否则给出的代码将不起作用。-1您不必添加
\uuuuuuuuuuueq\uuuuuuu
-还有其他可能的方法。@Marcin:是的,您这样做了-至少,这是最好的方法。@DavidRobinson是这样吗?如果为了单元测试的目的,您只想用这种方法测试相等性,那该怎么办?无论如何,这几乎肯定是一种很好的相等性方法(尽管只有维护软件的人才能肯定)。当前的类只有两个属性。有人用相等来表示“完全相同的对象”而不是“共享两个属性”的几率非常低。@DavidRobinson不太可能。如果需要这种行为,一个元组就足够了。拥有一个特定类的主要原因之一是要有一个更复杂的
\uuuuu eq\uuuu
或其他比较方法。