使用 pytest 比较从 REST 框架返回的两个字典
Compare two dictionaries returned from REST framework using pytest
我正在尝试使用 pytest 测试我的 Django 应用程序。我正在尝试发送这样的对象:
{
"x":1
"y":2
....
}
我的视图所做的是返回一个字典列表,所以在我的场景中,一个列表包含这个发送的字典。
我想在调用 get 时检查我发送的数据是否等于我的数据。我的问题是这两本词典总是被评估为假。
这就是我正在做的事情:
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
因为我正在调用列表视图,所以我应该得到一个带有一个字典的列表。第一个元素应该与发送的数据相同....但它永远不会相同。
我认为出了什么问题:我正在将一个字典与一个包含一个字典的列表进行比较。两者都以字节形式返回。所以我想我需要比较以字节形式返回的字典与列表的第一个元素也是以字节为单位的。我说的有道理吗?
有人知道我能做什么吗?或者也许更好的想法是如何构建测试?非常感谢!
正如打印语句所示,response_create.data
是一个 rest_framework.utils.serializer_helpers.ReturnDict
,它是 OrderedDict
的子类。
client.get
的return是一个DjangoResponse
object,这意味着你需要使用json
方法来获取内容。
所以像这样:
response_create = client.post(url, data, format='json')
response_get = client.get(url)
assert dict(response_create.data) == response_get.json()[0]
我正在尝试使用 pytest 测试我的 Django 应用程序。我正在尝试发送这样的对象:
{ "x":1 "y":2 .... }
我的视图所做的是返回一个字典列表,所以在我的场景中,一个列表包含这个发送的字典。
我想在调用 get 时检查我发送的数据是否等于我的数据。我的问题是这两本词典总是被评估为假。
这就是我正在做的事情:
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
因为我正在调用列表视图,所以我应该得到一个带有一个字典的列表。第一个元素应该与发送的数据相同....但它永远不会相同。
我认为出了什么问题:我正在将一个字典与一个包含一个字典的列表进行比较。两者都以字节形式返回。所以我想我需要比较以字节形式返回的字典与列表的第一个元素也是以字节为单位的。我说的有道理吗?
有人知道我能做什么吗?或者也许更好的想法是如何构建测试?非常感谢!
正如打印语句所示,response_create.data
是一个 rest_framework.utils.serializer_helpers.ReturnDict
,它是 OrderedDict
的子类。
client.get
的return是一个DjangoResponse
object,这意味着你需要使用json
方法来获取内容。
所以像这样:
response_create = client.post(url, data, format='json')
response_get = client.get(url)
assert dict(response_create.data) == response_get.json()[0]