Python 2.7 docs утверждает, что assertItemsEqual
"является эквивалентом assertEqual(sorted(expected), sorted(actual))
". В приведенном ниже примере все тесты проходят, за исключением test4. Почему в этом случае ошибка assertItemsEqual
?Почему успешный assertEqual не всегда означает успешный assertItemsEqual?
В соответствии с принципом наименьшего удивления, учитывая два итерационных, я ожидал бы, что успешный assertEqual
влечет за собой успешный assertItemsEqual
.
import unittest
class foo(object):
def __init__(self, a):
self.a = a
def __eq__(self, other):
return self.a == other.a
class test(unittest.TestCase):
def setUp(self):
self.list1 = [foo(1), foo(2)]
self.list2 = [foo(1), foo(2)]
def test1(self):
self.assertTrue(self.list1 == self.list2)
def test2(self):
self.assertEqual(self.list1, self.list2)
def test3(self):
self.assertEqual(sorted(self.list1), sorted(self.list2))
def test4(self):
self.assertItemsEqual(self.list1, self.list2)
if __name__=='__main__':
unittest.main()
Вот результат на моей машине:
FAIL: test4 (__main__.test)
----------------------------------------------------------------------
Traceback (most recent call last):
File "assert_test.py", line 25, in test4
self.assertItemsEqual(self.list1, self.list2)
AssertionError: Element counts were not equal:
First has 1, Second has 0: <__main__.foo object at 0x7f67b3ce2590>
First has 1, Second has 0: <__main__.foo object at 0x7f67b3ce25d0>
First has 0, Second has 1: <__main__.foo object at 0x7f67b3ce2610>
First has 0, Second has 1: <__main__.foo object at 0x7f67b3ce2650>
----------------------------------------------------------------------
Ran 4 tests in 0.001s
FAILED (failures=1)
Поскольку вы не определили порядок на объектах 'foo'? – wim
Спасибо. К вашему моменту, test4 проходит, если я определяю метод __hash__ на 'foo'. Однако в документах указано, что assertItemsEqual работает с неотображаемыми объектами. Неужели я не понимаю документа? –
Я не очень хорошо знаю Python, но сообщение об ошибке ясно говорит вам, что оно сравнивает списки, подсчитывая уникальные объекты в обоих, а затем сравнивая ключ подсчета по ключу. Сравнение осуществляется по адресу объекта. Поскольку у вас есть разные экземпляры объектов в каждом списке, списки сравниваются как не равные. Если вы сказали «a = foo (1); b = foo (2); self.list1 = [a, b] self.list2 = [b, a] ', я уверен, что последний тест пройдет. – Gene