Сравните два словаря, возвращенных из среды REST с помощью pytest - PullRequest
0 голосов
/ 29 октября 2019

Я пытаюсь проверить приложение django с помощью pytest. Я пытаюсь отправить объект следующим образом:

{"x": 1 "y": 2 ....}

То, что делает мой взгляд, возвращает список словарей,так что в моем сценарии список с этим одним отправленным словарем.

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

Вот что я делаю:

 def test_post_data_is_get_data(self):
        url = api_reverse('urlname') #I get the url
        data = sent_data #this is my dict I am sending defined as a big dict in my code
        response_create = client.post(url, data, format='json') # I save the response
        response_get = client.get(url) # I get the created data back
        print(type(response_create.data)) #debugging
        print(type(data))
        print(type(response_create.content))
        print(type(response_get))


        assert response_create == response_get

Типы, которые я печатаю:

<class 'rest_framework.utils.serializer_helpers.ReturnDict'>
<class 'dict'>
<class 'bytes'>

Не имеет значения, как я сравниваю, это никогда нетакой же. Я попытался сравнить отправленные данные с:

1) response_create.content == response_get.content
2) response_create.data == response_get.data
3) response_create.data == response_get[0]
4) response_create.data == response_get.first() ## error that byte like object has not attribute first

Поскольку я вызываю представление списка, я должен получить список с одним ответом. Первый элемент должен быть теми же данными, что и отправленный .... Но он никогда не будет прежним.

Я думаю, что идет не так: я сравниваю диктат со списком, внутри которого есть один диктовочный элемент. Оба возвращаются как байты. Поэтому я думаю, что мне нужно сравнить слова, которые возвращаются в байтах, с первым элементом списка, который также находится в байтах. Имею ли я смысл?

У кого-нибудь есть идеи, что я могу сделать? Или, может быть, лучшая идея, как структурировать тест? Большое спасибо заранее!

1 Ответ

1 голос
/ 29 октября 2019

Как показывают операторы печати, response_create.data - это rest_framework.utils.serializer_helpers.ReturnDict, который является подклассом OrderedDict.

Возвращением client.get является объект Django Response , что означает, что вам нужно использовать метод json для получения содержимого.

Так что-то вроде:

response_create = client.post(url, data, format='json')
response_get = client.get(url)
assert dict(response_create.data) == response_get.json()[0]
...