2017-02-02 4 views
2

Я новичок в модульном тестировании, и я пытаюсь запустить тест, чтобы проверить, одинаковы ли два словаря , не принимая во внимание элементы в значениях. Когда я пытаюсь:Использовать 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.

ответ

0

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

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})} 
?      ^