Il Python 2.7 docs stato che assertItemsEqual
"è l'equivalente di assertEqual(sorted(expected), sorted(actual))
". Nell'esempio seguente, tutti i test passano tranne test4. Perché assertItemsEqual
fallisce in questo caso?Perché un assertEqual di successo non implica sempre un assertItemsEqual di successo?
Per il principio di minimo stupore, dati due iterables, mi aspetto che un successo assertEqual
implichi un successo 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()
Ecco l'output sulla mia macchina:
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)
Perché non hai definito un ordinamento su oggetti 'pippo'? – wim
Grazie. Al tuo punto, test4 passa se definisco un metodo __hash__ su 'pippo'. Tuttavia, i documenti affermano che assertItemsEqual funziona su oggetti non selezionabili. Sto fraintendendo il documento? –
Non conosco molto bene Python, ma il messaggio di errore ti dice chiaramente che sta confrontando gli elenchi contando gli oggetti unici in entrambi e confrontando i codici chiave per chiave. I confronti sono per indirizzo dell'oggetto. Dal momento che esistono diverse istanze di oggetti in ciascuna lista, gli elenchi vengono confrontati come non uguali. Se hai detto 'a = foo (1); b = pippo (2); self.list1 = [a, b] self.list2 = [b, a] ', scommetto che l'ultimo test sarebbe passato. – Gene