assertEqual два слова, кроме одного ключа - PullRequest
1 голос
/ 26 января 2020

Мне нужно протестировать функцию, которая будет возвращать dict с rest_framework.test.APITestCase's assertEqual в django. Диктовка примерно такая:

{
    "first_name": "John",
    "last_name": "Doe",
    "random": some random number
}

Как я могу проверить возвращенный диктат с моим подходящим результатом, кроме клавиши random?

Я имею в виду assertEqual(a, result) должен вернуть True если пройдены эти два условия:

a = {
        "first_name": "John",
        "last_name": "Doe",
        "random": 12
    }

result = {
        "first_name": "John",
        "last_name": "Doe",
        "random": 24
    }

Есть ли в любом случае сделать такого рода исключения в assertEqual, или я должен использовать assert?

ОБНОВЛЕНИЕ:

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

assertEqual(list_of_dicts, expected_result_list)

Я имею в виду в этих двух списках:

list1 = [
 d1,
 d2,
 d3
]

list2 = [
 d1,
 d2,
 d3
]

должно быть равным без учета клавиши random в каждом диктовке

Нужно ли мне l oop просматривать список и сравнивать диктанты один за другим или для этого есть самое быстрое решение, так как хорошо?

Ответы [ 2 ]

1 голос
/ 26 января 2020

Вместо того, чтобы копировать и модифицировать обе копии, вы можете скопировать и изменить один из диктовок, чтобы исправить разницу:

a_copy = a.copy()
a_copy['random'] = b['random']
assertEqual(a_copy, b)
0 голосов
/ 26 января 2020

Вы можете создать копию словарей и вывести оттуда случайное число

a_copy = a.copy()
a_copy.pop("random")
result_copy = result.copy()
result_copy.pop("random")

assertEqual(a_copy, result_copy)

Если вы не хотите сохранять исходное использование pop() непосредственно в существующих словарях.

Если у вас есть два списка диктов, вы можете повторить оба с zip и сравнить каждую пару

for l, r in zip(copy.deepcopy(list_of_dicts), copy.deepcopy(expected_result_list)):
    l.pop("random")
    r.pop("random")
    assertEqual(l, r)
...