Использовать assertCountEqual для списков в asserDictEqual?

Я новичок в модульном тестировании, и я пытаюсь запустить тест, чтобы проверить, совпадают ли два словаря, не принимая во внимание порядок элементов в значениях. Когда я пытаюсь:

import unittest
dic1 = {'key': [1,2]}
dic2 = {'key': [2,1]}

class TestExample (unittest.TestCase):

def test_dicEqual(self):
    self.assertDictEqual(dic1, dic2)

tester = TestExample()
tester.test_dicEqual()

Я получил:

AssertionError                            Traceback (most recent call last)
AssertionError: {'key': [1, 2]} != {'key': [2, 1]}
- {'a': [1, 2]}
?         ---

+ {'a': [2, 1]}
?        +++

Есть ли способ проверить содержание словаря без учета порядка? Прямо сейчас решение, которое я нашел, состоит в том, чтобы перебрать ключи словаря:

def test_dictequal_iterate(self):
    for key, value in dic1 :
        self.assertCountEqual(value, dic2[key])

Но это решение не возвращает обзор, такой же ясный, как assertDictEqual.

1 ответ

Я не уверен, что это лучший способ сделать это, но вы, вероятно, можете попробовать это:

import unittest
from collections import Counter
dic1 = {'key': [1, 2]}
dic2 = {'key': [2, 1]}
dic3 = {'key': [1, 3]}
class TestExample (unittest.TestCase):
    def countize_dict(self, d):
        return {k:Counter(v) for k, v in d.items()}
    def assertDictEqualCountized(self, d1, d2):
        self.assertDictEqual(self.countize_dict(d1),
                             self.countize_dict(d2))
    def test_dicEqual(self):
        self.assertDictEqualCountized(dic1, dic2)
    def test_other_dic_equal(self):
        self.assertDictEqualCountized(dic1, dic3)



tester = TestExample()
tester.test_dicEqual() # pass
tester.test_other_dic_equal() # fail

AssertionError: {'key': Counter({1: 1, 2: 1})} != {'key': Counter({1: 1, 3: 1})}
- {'key': Counter({1: 1, 2: 1})}
?                        ^

+ {'key': Counter({1: 1, 3: 1})}
?                        ^
Другие вопросы по тегам