Como testar assert se duas listas de dicionários (onde um item de dict contém uma lista) são os mesmos

Micah Pearce:

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 assertCountEqualpara 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

Shubham Sharma:

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é unhashableporque o seu mutável.


Para realizar a tarefa desejada você poderia usar o frozenset. O frozensetconstró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.

Acho que você gosta

Origin http://43.154.161.224:23101/article/api/json?id=298471&siteId=1
Recomendado
Clasificación