Estou criando meu primeiro script de teste (yay!) Eu sou tem uma lista de dicionários em que uma das chaves é uma lista. Eu gostaria que o teste passado se a lista (no dicionário) é em qualquer ordem. Eu sei que você pode usar assertCountEqual
para verificar a lista de igualdade, independentemente da ordem, mas você pode fazer isso para uma lista que contém um dictinary de listas? Veja abaixo, por exemplo,
sucederá
def test(self):
output = [2,1]
desired_output = [1,2]
self.assertCountEqual(output, desired_output)
Vai falhar
def test(self):
desired_output = [{'count': 2, 'columns': ['col2', 'col5']}]
output = [{'count': 2, 'columns': ['col5', 'col2']}]
self.assertCountEqual(output, desired_output)
obrigado
a assertCountEqual(first, second, msg=None)
:
Teste que contém sequência primeiro os mesmos elementos como a segunda, independentemente da sua ordem. Quando eles não o fizerem, será gerada uma mensagem de erro listando as diferenças entre as sequências.
Importante:
Chamando assertCountEqual(first, second, msg=None)
é equivalente a chamar assertEqual(Counter(list(first)), Counter(list(second)))
.
Nota:
Um Contador é uma subclasse dict para contar objetos Hashable. É uma coleção onde os elementos são armazenados como chaves de dicionário e suas contagens são armazenados como valores de dicionário. Para que isso funcione as chaves tem que ser hashable
, mas infelizmente o dict
é unhashable
porque o seu mutável.
Para realizar a tarefa desejada você poderia usar o frozenset
. O frozenset
constrói uma coleção não-ordenada imutável de elementos únicos. Para ter o teste ter sucesso você terá que construir um dicionário cujos valores correspondentes às suas chaves são imutáveis. Podemos usar a abordagem recursiva para construir um dicionário que contém valores imutáveis.
Tente isto (UPDATE):
def getHashableDict(dictionary):
hashable_dict = {}
for key, value in dictionary.items():
if isinstance(value, list):
hashable_dict[key] = frozenset(value)
elif isinstance(value, dict):
hashable_dict[key] = getHashableDict(value)
else:
hashable_dict[key] = value
return frozenset(hashable_dict.items())
def test(self):
desired_output = [{'count': 2, 'columns': ['col2', 'col5']}]
output = [{'count': 2, 'columns': ['col5', 'col2']}]
output = [getHashableDict(item) for item in output] #--> create list of hashable types
desired_output = [getHashableDict(item) for item in desired_output]
self.assertCountEqual(output, desired_output)
O teste irá agora ter sucesso.